From a97242e332ed3fe1966d28d0cf128c1a188cc681 Mon Sep 17 00:00:00 2001 From: Frantisek Vacek Date: Wed, 2 Oct 2013 10:49:01 +0200 Subject: [PATCH] Qnx: Momentics Cascades project importer Change-Id: I232d97cd1570b37f694540337b1075800e330e97 Reviewed-by: Nicolas Arnaud-Cormos --- src/plugins/coreplugin/basefilewizard.cpp | 9 +- src/plugins/coreplugin/basefilewizard.h | 5 + .../cascadesimport/bardescriptorconverter.cpp | 248 +++++++++++++++ .../cascadesimport/bardescriptorconverter.h | 76 +++++ .../qnx/cascadesimport/cascadesimport.pri | 23 ++ .../qnx/cascadesimport/cascadesimport.qrc | 5 + .../cascadesimport/cascadesimportwizard.cpp | 300 ++++++++++++++++++ .../qnx/cascadesimport/cascadesimportwizard.h | 93 ++++++ .../qnx/cascadesimport/fileconverter.cpp | 99 ++++++ .../qnx/cascadesimport/fileconverter.h | 85 +++++ src/plugins/qnx/cascadesimport/importlog.cpp | 152 +++++++++ src/plugins/qnx/cascadesimport/importlog.h | 72 +++++ .../qnx/cascadesimport/importlogconverter.cpp | 68 ++++ .../qnx/cascadesimport/importlogconverter.h | 51 +++ .../cascadesimport/projectfileconverter.cpp | 195 ++++++++++++ .../qnx/cascadesimport/projectfileconverter.h | 58 ++++ .../resources/templates/project.pro | 46 +++ .../cascadesimport/srcprojectwizardpage.cpp | 85 +++++ .../qnx/cascadesimport/srcprojectwizardpage.h | 64 ++++ .../cascadesimport/srcprojectwizardpage.ui | 42 +++ src/plugins/qnx/qnx.pro | 1 + src/plugins/qnx/qnx.qbs | 27 ++ src/plugins/qnx/qnxconstants.h | 2 + src/plugins/qnx/qnxplugin.cpp | 2 + 24 files changed, 1805 insertions(+), 3 deletions(-) create mode 100644 src/plugins/qnx/cascadesimport/bardescriptorconverter.cpp create mode 100644 src/plugins/qnx/cascadesimport/bardescriptorconverter.h create mode 100644 src/plugins/qnx/cascadesimport/cascadesimport.pri create mode 100644 src/plugins/qnx/cascadesimport/cascadesimport.qrc create mode 100644 src/plugins/qnx/cascadesimport/cascadesimportwizard.cpp create mode 100644 src/plugins/qnx/cascadesimport/cascadesimportwizard.h create mode 100644 src/plugins/qnx/cascadesimport/fileconverter.cpp create mode 100644 src/plugins/qnx/cascadesimport/fileconverter.h create mode 100644 src/plugins/qnx/cascadesimport/importlog.cpp create mode 100644 src/plugins/qnx/cascadesimport/importlog.h create mode 100644 src/plugins/qnx/cascadesimport/importlogconverter.cpp create mode 100644 src/plugins/qnx/cascadesimport/importlogconverter.h create mode 100644 src/plugins/qnx/cascadesimport/projectfileconverter.cpp create mode 100644 src/plugins/qnx/cascadesimport/projectfileconverter.h create mode 100644 src/plugins/qnx/cascadesimport/resources/templates/project.pro create mode 100644 src/plugins/qnx/cascadesimport/srcprojectwizardpage.cpp create mode 100644 src/plugins/qnx/cascadesimport/srcprojectwizardpage.h create mode 100644 src/plugins/qnx/cascadesimport/srcprojectwizardpage.ui diff --git a/src/plugins/coreplugin/basefilewizard.cpp b/src/plugins/coreplugin/basefilewizard.cpp index eb11eba5c19..8412e6ea459 100644 --- a/src/plugins/coreplugin/basefilewizard.cpp +++ b/src/plugins/coreplugin/basefilewizard.cpp @@ -187,15 +187,18 @@ BaseFileWizard::~BaseFileWizard() { } +BaseFileWizard::ExtensionList BaseFileWizard::selectExtensions() +{ + return ExtensionSystem::PluginManager::getObjects(); +} + void BaseFileWizard::runWizard(const QString &path, QWidget *parent, const QString &platform, const QVariantMap &extraValues) { QTC_ASSERT(!path.isEmpty(), return); - typedef QList ExtensionList; - QString errorMessage; // Compile extension pages, purge out unused ones - ExtensionList extensions = ExtensionSystem::PluginManager::getObjects(); + ExtensionList extensions = selectExtensions(); WizardPageList allExtensionPages; for (ExtensionList::iterator it = extensions.begin(); it != extensions.end(); ) { const WizardPageList extensionPages = (*it)->extensionPages(this); diff --git a/src/plugins/coreplugin/basefilewizard.h b/src/plugins/coreplugin/basefilewizard.h index d8005242c47..6eac0a66877 100644 --- a/src/plugins/coreplugin/basefilewizard.h +++ b/src/plugins/coreplugin/basefilewizard.h @@ -52,6 +52,8 @@ namespace Utils { class Wizard; } namespace Core { +class IFileWizardExtension; + class CORE_EXPORT WizardDialogParameters { public: @@ -117,9 +119,12 @@ public: protected: typedef QList WizardPageList; + typedef QList ExtensionList; explicit BaseFileWizard(QObject *parent = 0); + virtual ExtensionList selectExtensions(); + virtual QWizard *createWizardDialog(QWidget *parent, const WizardDialogParameters &wizardDialogParameters) const = 0; diff --git a/src/plugins/qnx/cascadesimport/bardescriptorconverter.cpp b/src/plugins/qnx/cascadesimport/bardescriptorconverter.cpp new file mode 100644 index 00000000000..19331475267 --- /dev/null +++ b/src/plugins/qnx/cascadesimport/bardescriptorconverter.cpp @@ -0,0 +1,248 @@ +/**************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: BlackBerry Limited (blackberry-qt@qnx.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 +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** 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. +** +** 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. +** +****************************************************************************/ + +#include "bardescriptorconverter.h" + +#include +#include + +#include + +namespace Qnx { +namespace Internal { + +////////////////////////////////////////////////////////////////////////////// +// +// BarDescriptorConverter +// +////////////////////////////////////////////////////////////////////////////// +static const char S_ASSET[] = "asset"; +static const char S_PATH[] = "path"; +static const char S_SRC_DIR[] = "%SRC_DIR%/"; + +BarDescriptorConverter::BarDescriptorConverter(ConvertedProjectContext &ctx) + : FileConverter(ctx) +{ +} + +QString BarDescriptorConverter::projectName() const +{ + return convertedProjectContext().projectName(); +} + +QString BarDescriptorConverter::applicationBinaryName() const +{ + return projectName(); +} + +QString BarDescriptorConverter::applicationBinaryPath() const +{ + return projectName(); +} + +QDomElement BarDescriptorConverter::findElement(QDomDocument &doc, const QString &tagName, + const QString &attributeName, const QString &attributeValue) +{ + QDomElement ret; + QTC_ASSERT(!tagName.isEmpty(), return ret); + QDomElement rootElement = doc.documentElement(); + static const QLatin1String elementTextFakeAttributeNameString("S_ELEMENT_TEXT_FAKE_ATTRIBUTE_NAME"); + bool isFindText = (attributeName == elementTextFakeAttributeNameString); + QRegExp rxAttrValue; + if (!isFindText && !attributeValue.isEmpty()) + rxAttrValue = QRegExp(attributeValue, Qt::CaseSensitive, QRegExp::Wildcard); + for (QDomElement el = rootElement.firstChildElement(tagName); + !el.isNull(); el = el.nextSiblingElement(tagName)) { + if (attributeName.isEmpty()) { + // take first matching tag name + ret = el; + break; + } else if (isFindText) { + QString s = el.text(); + if (s == attributeValue) { + ret = el; + break; + } + } else if (el.hasAttribute(attributeName)) { + if (attributeValue.isEmpty() || rxAttrValue.exactMatch(el.attribute(attributeName))) { + ret = el; + break; + } + } + } + return ret; +} + +QDomElement BarDescriptorConverter::ensureElement(QDomDocument &doc, const QString &tagName, + const QString &attributeName, const QString &attributeValue) +{ + QDomElement ret = findElement(doc, tagName, attributeName, attributeValue); + if (ret.isNull()) { + QDomElement rootElement = doc.documentElement(); + ret = rootElement.appendChild(doc.createElement(tagName)).toElement(); + QTC_ASSERT(!ret.isNull(), return ret); + } + if (!attributeName.isEmpty()) { + ret.setAttribute(attributeName, attributeValue); + } + return ret; +} + +QDomElement BarDescriptorConverter::removeElement(QDomDocument &doc, const QString &tagName, + const QString &attributeName, const QString &attributeValue) +{ + QDomElement ret = findElement(doc, tagName, attributeName, attributeValue); + if (!ret.isNull()) { + QDomNode nd = ret.parentNode(); + QTC_ASSERT(!nd.isNull(), return ret); + nd.removeChild(ret); + } + return ret; +} + +void BarDescriptorConverter::setEnv(QDomDocument &doc, const QString &name, const QString &value) +{ + QDomElement el = ensureElement(doc, QLatin1String("env"), QLatin1String("var"), name); + QTC_ASSERT(!el.isNull(), return); + el.setAttribute(QString::fromLatin1("value"), value); +} + +void BarDescriptorConverter::setAsset(QDomDocument &doc, const QString &srcPath, + const QString &destPath, const QString &type, bool isEntry) +{ + ImportLog &log = convertedProjectContext().importLog(); + log.logInfo(tr("Setting asset path: %1 to %2 type: %3 entry point: %4") + .arg(srcPath).arg(destPath).arg(type).arg(isEntry)); + QDomElement assetElement = ensureElement(doc, QLatin1String(S_ASSET), QLatin1String(S_PATH), srcPath); + QTC_ASSERT(!assetElement.isNull(), return); + while (assetElement.hasChildNodes()) { + QDomNode nd = assetElement.firstChild(); + assetElement.removeChild(nd); + } + assetElement.appendChild(doc.createTextNode(destPath)); + + const QString typeString = QLatin1String("type"); + QString s = assetElement.attribute(typeString); + if (s != type) + assetElement.setAttribute(typeString, type); + + const QString entryString = QLatin1String("entry"); + s = assetElement.attribute(entryString); + bool b = (s.compare(QLatin1String("true"), Qt::CaseInsensitive) == 0) + || (s.compare(QLatin1String("1")) == 0); + if (b != isEntry) + assetElement.setAttribute(entryString, QVariant(isEntry).toString()); +} + +void BarDescriptorConverter::removeAsset(QDomDocument &doc, const QString &srcPath) +{ + ImportLog &log = convertedProjectContext().importLog(); + log.logInfo(tr("Removing asset path: %1").arg(srcPath)); + removeElement(doc, QLatin1String(S_ASSET), QLatin1String(S_PATH), srcPath); +} + +void BarDescriptorConverter::replaceAssetSourcePath(QDomDocument &doc, const QString &oldSrcPath, + const QString &newSrcPath) +{ + ImportLog &log = convertedProjectContext().importLog(); + QDomElement el = ensureElement(doc, QLatin1String(S_ASSET), QLatin1String(S_PATH), oldSrcPath); + if (!el.isNull()) { + log.logInfo(tr("Replacing asset source path: %1 -> %2").arg(oldSrcPath).arg(newSrcPath)); + el.setAttribute(QLatin1String(S_PATH), newSrcPath); + } +} + +void BarDescriptorConverter::fixImageAsset(QDomDocument &doc, const QString &definitionElementName) +{ + ImportLog &log = convertedProjectContext().importLog(); + QString target; + QDomElement el = findElement(doc, definitionElementName, QString(), QString()); + if (!el.isNull()) { + const QString imageString = QLatin1String("image"); + for (QDomElement imageElement = el.firstChildElement(imageString); !imageElement.isNull(); + imageElement = imageElement.nextSiblingElement(imageString)) { + target = imageElement.text(); + if (!target.isEmpty()) + replaceAssetSourcePath(doc, target, QLatin1String(S_SRC_DIR) % target); + } + } else { + log.logWarning(tr("Cannot find image asset definition: <%1>").arg(definitionElementName)); + } +} + +void BarDescriptorConverter::fixIconAsset(QDomDocument &doc) +{ + const QString iconString = QString::fromLatin1("icon"); + fixImageAsset(doc, iconString); +} + +void BarDescriptorConverter::fixSplashScreensAsset(QDomDocument &doc) +{ + const QString splashScreensString = QString::fromLatin1("splashScreens"); + fixImageAsset(doc, splashScreensString); +} + +bool BarDescriptorConverter::convertFile(Core::GeneratedFile &file, QString &errorMessage) +{ + FileConverter::convertFile(file, errorMessage); + if (errorMessage.isEmpty()) { + QDomDocument doc; + if (!doc.setContent(file.binaryContents(), &errorMessage)) { + errorMessage = tr("Error parsing XML file '%1': %2").arg(file.path()).arg(errorMessage); + return false; + } + + // remove elements, since they are Momentics specific + QDomElement rootElement = doc.documentElement(); + const QString configurationString = QLatin1String("configuration"); + while (true) { + QDomElement el = rootElement.firstChildElement(configurationString); + if (el.isNull()) + break; + rootElement.removeChild(el); + } + + // remove obsolete assets + removeAsset(doc, QLatin1String("translations")); + removeAsset(doc, QLatin1String("translations/*")); + // assets + setAsset(doc, applicationBinaryPath(), applicationBinaryName(), + QLatin1String("Qnx/Elf"), true); + const QString assetsString = QLatin1String("assets"); + replaceAssetSourcePath(doc, assetsString, QLatin1String(S_SRC_DIR) % assetsString); + fixIconAsset(doc); + fixSplashScreensAsset(doc); + + file.setBinaryContents(doc.toByteArray(4)); + } + return errorMessage.isEmpty(); +} + +} // namespace Internal +} // namespace Qnx diff --git a/src/plugins/qnx/cascadesimport/bardescriptorconverter.h b/src/plugins/qnx/cascadesimport/bardescriptorconverter.h new file mode 100644 index 00000000000..40bc7948e25 --- /dev/null +++ b/src/plugins/qnx/cascadesimport/bardescriptorconverter.h @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: BlackBerry Limited (blackberry-qt@qnx.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 +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** 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. +** +** 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. +** +****************************************************************************/ + +#ifndef QNX_BLACKBERRY_CASCADESPROJECTIMPORT_BARDESCRIPTORCONVERTER_H +#define QNX_BLACKBERRY_CASCADESPROJECTIMPORT_BARDESCRIPTORCONVERTER_H + +#include "fileconverter.h" + +#include + +class QDomElement; +class QDomDocument; + +namespace Qnx { +namespace Internal { + +class BarDescriptorConverter : public FileConverter +{ + Q_DECLARE_TR_FUNCTIONS(BarDescriptorConverter); +public: + BarDescriptorConverter(ConvertedProjectContext &ctx); + virtual ~BarDescriptorConverter() {} + + bool convertFile(Core::GeneratedFile &file, QString &errorMessage); +private: + QString projectName() const; + QString applicationBinaryName() const; + QString applicationBinaryPath() const; + + QDomElement findElement(QDomDocument &doc, const QString &tagName, + const QString &attributeName, const QString &attributeValue); + QDomElement ensureElement(QDomDocument &doc, const QString &tagName, + const QString &attributeName, const QString &attributeValue); + QDomElement removeElement(QDomDocument &doc, const QString &tagName, + const QString &attributeName, const QString &attributeValue); + + void fixImageAsset(QDomDocument &doc, const QString &definitionElementName); + void fixIconAsset(QDomDocument &doc); + void fixSplashScreensAsset(QDomDocument &doc); + + void setEnv(QDomDocument &doc, const QString &name, const QString &value); + void setAsset(QDomDocument &doc, const QString &srcPath, const QString &destPath, const QString &type = QString(), bool isEntry = false); + void removeAsset(QDomDocument &doc, const QString &srcPath); + void replaceAssetSourcePath(QDomDocument &doc, const QString &oldSrcPath, const QString &newSrcPath); +}; + +} // namespace Internal +} // namespace Qnx + +#endif // QNX_BLACKBERRY_CASCADESPROJECTIMPORT_BARDESCRIPTORCONVERTER_H diff --git a/src/plugins/qnx/cascadesimport/cascadesimport.pri b/src/plugins/qnx/cascadesimport/cascadesimport.pri new file mode 100644 index 00000000000..82962717e3f --- /dev/null +++ b/src/plugins/qnx/cascadesimport/cascadesimport.pri @@ -0,0 +1,23 @@ +SOURCES += \ + $$PWD/cascadesimportwizard.cpp \ + $$PWD/srcprojectwizardpage.cpp \ + $$PWD/fileconverter.cpp \ + $$PWD/bardescriptorconverter.cpp \ + $$PWD/projectfileconverter.cpp \ + $$PWD/importlogconverter.cpp \ + $$PWD/importlog.cpp \ + +HEADERS += \ + $$PWD/cascadesimportwizard.h \ + $$PWD/srcprojectwizardpage.h \ + $$PWD/fileconverter.h \ + $$PWD/bardescriptorconverter.h \ + $$PWD/projectfileconverter.h \ + $$PWD/importlogconverter.h \ + $$PWD/importlog.h \ + +FORMS += \ + $$PWD/srcprojectwizardpage.ui \ + +RESOURCES += \ + $$PWD/cascadesimport.qrc \ diff --git a/src/plugins/qnx/cascadesimport/cascadesimport.qrc b/src/plugins/qnx/cascadesimport/cascadesimport.qrc new file mode 100644 index 00000000000..da52ad2e547 --- /dev/null +++ b/src/plugins/qnx/cascadesimport/cascadesimport.qrc @@ -0,0 +1,5 @@ + + + resources/templates/project.pro + + diff --git a/src/plugins/qnx/cascadesimport/cascadesimportwizard.cpp b/src/plugins/qnx/cascadesimport/cascadesimportwizard.cpp new file mode 100644 index 00000000000..a90a560d162 --- /dev/null +++ b/src/plugins/qnx/cascadesimport/cascadesimportwizard.cpp @@ -0,0 +1,300 @@ +/**************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: BlackBerry Limited (blackberry-qt@qnx.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 +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** 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. +** +** 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. +** +****************************************************************************/ + +#include "cascadesimportwizard.h" +#include "srcprojectwizardpage.h" +#include "bardescriptorconverter.h" +#include "importlogconverter.h" +#include "projectfileconverter.h" + +#include + +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace Qnx { +namespace Internal { + +////////////////////////////////////////////////////////////////////////////// +// +// CascadesImportWizardDialog +// +////////////////////////////////////////////////////////////////////////////// + +CascadesImportWizardDialog::CascadesImportWizardDialog(QWidget *parent) + : Utils::Wizard(parent) +{ + setWindowTitle(tr("Import Existing Momentics Cascades Project")); + + m_srcProjectPage = new SrcProjectWizardPage(this); + m_srcProjectPage->setTitle(tr("Momentics Cascades Project Name and Location")); + + m_destProjectPage = new Utils::ProjectIntroPage(this); + m_destProjectPage->setTitle(tr("Project Name and Location")); + m_destProjectPage->setPath(Core::DocumentManager::projectsDirectory()); + + const int srcProjectPageId = addPage(m_srcProjectPage); + wizardProgress()->item(srcProjectPageId)->setTitle(tr("Momentics")); + + const int destProjectPageId = addPage(m_destProjectPage); + wizardProgress()->item(destProjectPageId)->setTitle(tr("QtCreator")); + + connect(m_srcProjectPage, SIGNAL(validPathChanged(QString)), this, SLOT(onSrcProjectPathChanged(QString))); +} + +QString CascadesImportWizardDialog::srcProjectPath() const +{ + return m_srcProjectPage->path(); +} + +QString CascadesImportWizardDialog::destProjectPath() const +{ + return m_destProjectPage->path() % QLatin1Char('/') % projectName(); +} + +QString CascadesImportWizardDialog::projectName() const +{ + return m_destProjectPage->projectName(); +} + +void CascadesImportWizardDialog::onSrcProjectPathChanged(const QString &path) +{ + Q_UNUSED(path); + m_destProjectPage->setProjectName(m_srcProjectPage->projectName()); +} + +////////////////////////////////////////////////////////////////////////////// +// +// Wizard +// +////////////////////////////////////////////////////////////////////////////// +static const char IMPORT_LOG_FILE_NAME[] = "import.log"; + +CascadesImportWizard::CascadesImportWizard(QObject *parent) +: Core::BaseFileWizard(parent) +{ + setWizardKind(ProjectWizard); + setIcon(QPixmap(QLatin1String(Qnx::Constants::QNX_BB_CATEGORY_ICON))); + setDisplayName(tr("Momentics Cascades Project")); + setId(QLatin1String("Q.QnxBlackBerryCascadesApp")); + setRequiredFeatures(Core::FeatureSet(Constants::QNX_BB_FEATURE)); + setDescription(tr("Imports existing Cascades projects created within QNX Momentics IDE. " + "This allows you to use the project in QtCreator.")); + setCategory(QLatin1String(ProjectExplorer::Constants::IMPORT_WIZARD_CATEGORY)); + setDisplayCategory(QLatin1String(ProjectExplorer::Constants::IMPORT_WIZARD_CATEGORY_DISPLAY)); +} + +CascadesImportWizard::~CascadesImportWizard() +{ +} + +Core::FeatureSet CascadesImportWizard::requiredFeatures() const +{ + return Core::FeatureSet(Constants::QNX_BB_FEATURE); +} + +Core::BaseFileWizard::ExtensionList CascadesImportWizard::selectExtensions() +{ + return Core::BaseFileWizard::ExtensionList(); +} + +QWizard *CascadesImportWizard::createWizardDialog(QWidget *parent, + const Core::WizardDialogParameters &wizardDialogParameters) const +{ + CascadesImportWizardDialog *wizard = new CascadesImportWizardDialog(parent); + setupWizard(wizard); + + foreach (QWizardPage *p, wizardDialogParameters.extensionPages()) + BaseFileWizard::applyExtensionPageShortTitle(wizard, wizard->addPage(p)); + + return wizard; +} + +bool CascadesImportWizard::convertFile(Core::GeneratedFile &file, + ConvertedProjectContext &projectContext, QString &errorMessage) const +{ + bool ret = false; + if (convertFileContent(file, projectContext, errorMessage)) + if (convertFilePath(file, projectContext, errorMessage)) + ret = true; + return ret; +} + +bool CascadesImportWizard::convertFileContent(Core::GeneratedFile &file, + ConvertedProjectContext &projectContext, QString &errorMessage) const +{ + QString filePath = file.path(); + QString fileName = filePath.section(QLatin1Char('/'), -1); + bool isRootFile = (fileName == filePath); + QString fileExtension = fileName.section(QLatin1Char('.'), -1).toLower(); + bool useFileConverter = true; + if (isRootFile) { + if (fileName == QLatin1String("bar-descriptor.xml")) { + BarDescriptorConverter conv(projectContext); + conv.convertFile(file, errorMessage); + useFileConverter = false; + } else if (fileName == QLatin1String(IMPORT_LOG_FILE_NAME)) { + ImportLogConverter conv(projectContext); + conv.convertFile(file, errorMessage); + useFileConverter = false; + } else if (fileExtension == QLatin1String("pro")) { + ProjectFileConverter conv(projectContext); + conv.convertFile(file, errorMessage); + useFileConverter = false; + } + } + if (useFileConverter) { + FileConverter conv(projectContext); + conv.convertFile(file, errorMessage); + } + return errorMessage.isEmpty(); +} + +bool CascadesImportWizard::convertFilePath(Core::GeneratedFile &file, + ConvertedProjectContext &projectContext, QString &errorMessage) const +{ + Q_UNUSED(errorMessage); + const QString destProjectPath = projectContext.destProjectPath(); + file.setPath(destProjectPath % QLatin1Char('/') % file.path()); + return true; +} + +void CascadesImportWizard::collectFiles_helper(QStringList &filePaths, + ConvertedProjectContext &projectContext, const QString &rootPath, + const QList< QRegExp > &blackList) const +{ + const QString srcProjectPath = projectContext.srcProjectPath(); + bool isProjectRoot = (rootPath.length() == srcProjectPath.length()); + QDirIterator it(rootPath, QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs); + while (it.hasNext()) { + it.next(); + bool isBlacklisted = false; + QString fileName = it.fileName(); + foreach (const QRegExp &rx, blackList) { + QString pattern = rx.pattern(); + if (pattern.at(0) == QLatin1Char('/')) { + if (isProjectRoot) { + QString fn = QLatin1Char('/') % fileName; + if (rx.exactMatch(fn)) { + isBlacklisted = true; + break; + } + } + } else { + if (rx.exactMatch(fileName)) { + isBlacklisted = true; + break; + } + } + } + if (!isBlacklisted) { + QFileInfo fi = it.fileInfo(); + if (fi.isFile()) + filePaths << it.filePath().mid(srcProjectPath.length() + 1); + else if (fi.isDir()) + collectFiles_helper(filePaths, projectContext, it.filePath(), blackList); + } + } +} + +bool CascadesImportWizard::collectFiles(ConvertedProjectContext &projectContext, QString &errorMessage) const +{ + static QList blackList; + if (blackList.isEmpty()) { + blackList << QRegExp(QLatin1String("/arm"), Qt::CaseInsensitive, QRegExp::Wildcard) + << QRegExp(QLatin1String("/x86"), Qt::CaseInsensitive, QRegExp::Wildcard) + << QRegExp(QLatin1String("/translations"), Qt::CaseInsensitive, QRegExp::Wildcard) + << QRegExp(QLatin1String("Makefile"), Qt::CaseInsensitive, QRegExp::Wildcard) + << QRegExp(QLatin1String("Makefile.*"), Qt::CaseInsensitive, QRegExp::Wildcard) + << QRegExp(QLatin1String("/config.pri"), Qt::CaseInsensitive, QRegExp::Wildcard) + << QRegExp(QLatin1String("/precompiled.h"), Qt::CaseInsensitive, QRegExp::Wildcard); + } + QStringList filePaths; + collectFiles_helper(filePaths, projectContext, projectContext.srcProjectPath(), blackList); + filePaths << QLatin1String(IMPORT_LOG_FILE_NAME); + projectContext.setCollectedFiles(filePaths); + return errorMessage.isEmpty(); +} + +Core::GeneratedFiles CascadesImportWizard::generateFiles(const QWizard *w, QString *pErrorMessage) const +{ + Core::GeneratedFiles files; + QString errorMessage; + + const CascadesImportWizardDialog *wizardDialog = qobject_cast(w); + if (wizardDialog) { + ConvertedProjectContext projectContext; + projectContext.setSrcProjectPath(wizardDialog->srcProjectPath()); + projectContext.setDestProjectPath(wizardDialog->destProjectPath()); + + if (collectFiles(projectContext, errorMessage)) { + foreach (const QString &filePath, projectContext.collectedFiles()) { + Core::GeneratedFile file(filePath); + if (convertFile(file, projectContext, errorMessage)) { + if (!file.path().isEmpty()) + files << file; + } + if (!errorMessage.isEmpty()) { + errorMessage = tr("Error generating file '%1': %2").arg(filePath).arg(errorMessage); + break; + } + } + } + } + + + if (!errorMessage.isEmpty()) + if (pErrorMessage) + *pErrorMessage = errorMessage; + return files; +} + +bool CascadesImportWizard::postGenerateFiles(const QWizard *w, const Core::GeneratedFiles &l, QString *errorMessage) +{ + Q_UNUSED(w); + return ProjectExplorer::CustomProjectWizard::postGenerateOpen(l, errorMessage); +} + +} // namespace Internal +} // namespace Qnx diff --git a/src/plugins/qnx/cascadesimport/cascadesimportwizard.h b/src/plugins/qnx/cascadesimport/cascadesimportwizard.h new file mode 100644 index 00000000000..599be858e6f --- /dev/null +++ b/src/plugins/qnx/cascadesimport/cascadesimportwizard.h @@ -0,0 +1,93 @@ +/**************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: BlackBerry Limited (blackberry-qt@qnx.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 +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** 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. +** +** 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. +** +****************************************************************************/ + +#ifndef QNX_BLACKBERRY_CASCADESIMPORT_WIZARD_H +#define QNX_BLACKBERRY_CASCADESIMPORT_WIZARD_H + +#include "fileconverter.h" + +#include +#include + +namespace Utils { + class ProjectIntroPage; +} + +namespace Qnx { +namespace Internal { + +class SrcProjectWizardPage; + +class CascadesImportWizardDialog : public Utils::Wizard +{ + Q_OBJECT +public: + CascadesImportWizardDialog(QWidget *parent = 0); + + QString srcProjectPath() const; + QString destProjectPath() const; + + QString projectName() const; +private slots: + void onSrcProjectPathChanged(const QString &path); +private: + SrcProjectWizardPage *m_srcProjectPage; + Utils::ProjectIntroPage *m_destProjectPage; +}; + +class CascadesImportWizard : public Core::BaseFileWizard +{ + Q_OBJECT +public: + CascadesImportWizard(QObject *parent = 0); + virtual ~CascadesImportWizard(); + + Core::FeatureSet requiredFeatures() const; +protected: + ExtensionList selectExtensions(); + QWizard* createWizardDialog(QWidget *parent, + const Core::WizardDialogParameters &wizardDialogParameters) const; + Core::GeneratedFiles generateFiles(const QWizard *w, QString *errorMessage) const; + bool postGenerateFiles(const QWizard *w, const Core::GeneratedFiles &l, QString *errorMessage); +private: + bool collectFiles(ConvertedProjectContext &projectContext, QString &errorMessage) const; + void collectFiles_helper(QStringList &file_paths, ConvertedProjectContext &projectContext, + const QString &rootPath, const QList< QRegExp > &blackList) const; + bool convertFile(Core::GeneratedFile &file, ConvertedProjectContext &projectContext, + QString &errorMessage) const; + bool convertFilePath(Core::GeneratedFile &file, ConvertedProjectContext &projectContext, + QString &errorMessage) const; + bool convertFileContent(Core::GeneratedFile &file, ConvertedProjectContext &projectContext, + QString &errorMessage) const; +}; + +} // namespace Internal +} // namespace Qnx + +#endif // QNX_BLACKBERRY_CASCADESIMPORT_WIZARD_H diff --git a/src/plugins/qnx/cascadesimport/fileconverter.cpp b/src/plugins/qnx/cascadesimport/fileconverter.cpp new file mode 100644 index 00000000000..9a97f8c5c7c --- /dev/null +++ b/src/plugins/qnx/cascadesimport/fileconverter.cpp @@ -0,0 +1,99 @@ +/**************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: BlackBerry Limited (blackberry-qt@qnx.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 +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** 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. +** +** 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. +** +****************************************************************************/ + +#include "fileconverter.h" + +#include +#include + +namespace Qnx { +namespace Internal { + +////////////////////////////////////////////////////////////////////////////// +// +// ConvertedProjectContext +// +////////////////////////////////////////////////////////////////////////////// +QString ConvertedProjectContext::projectName() const +{ + return destProjectPath().section(QLatin1Char('/'), -1); +} + +////////////////////////////////////////////////////////////////////////////// +// +// FileConverter +// +////////////////////////////////////////////////////////////////////////////// +bool FileConverter::convertFile(Core::GeneratedFile &file, QString &errorMessage) +{ + ImportLog &log = convertedProjectContext().importLog(); + log.logInfo(tr("===== Converting file: %1").arg(file.path())); + loadFileContent(file, errorMessage); + if (!errorMessage.isEmpty()) + logError(errorMessage); + return errorMessage.isEmpty(); +} + +QByteArray FileConverter::loadFileContent(const QString &filePath, QString &errorMessage) +{ + QByteArray ret; + Utils::FileReader fr; + QString absFilePath = filePath; + if (!filePath.startsWith(QLatin1String(":/"))) { + const QString srcProjectPath = convertedProjectContext().srcProjectPath(); + absFilePath = srcProjectPath % QLatin1Char('/') % filePath; + } + fr.fetch(absFilePath); + if (!fr.errorString().isEmpty()) + errorMessage = fr.errorString(); + else + ret = fr.data(); + return ret; +} + +bool FileConverter::loadFileContent(Core::GeneratedFile &file, QString &errorMessage) +{ + if (file.binaryContents().isEmpty()) { + // virtual files have some content set already + QString filePath = file.path(); + QByteArray ba = loadFileContent(filePath, errorMessage); + file.setBinaryContents(ba); + } + return errorMessage.isEmpty(); +} + +void FileConverter::logError(const QString &errorMessage) +{ + if (!errorMessage.isEmpty()) + convertedProjectContext().importLog().logError(errorMessage); +} + +} // namespace Internal +} // namespace Qnx + diff --git a/src/plugins/qnx/cascadesimport/fileconverter.h b/src/plugins/qnx/cascadesimport/fileconverter.h new file mode 100644 index 00000000000..0a8d0fe4c89 --- /dev/null +++ b/src/plugins/qnx/cascadesimport/fileconverter.h @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: BlackBerry Limited (blackberry-qt@qnx.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 +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** 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. +** +** 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. +** +****************************************************************************/ + +#ifndef QNX_BLACKBERRY_CASCADESPROJECTIMPORT_FILECONVERTER_H +#define QNX_BLACKBERRY_CASCADESPROJECTIMPORT_FILECONVERTER_H + +#include "importlog.h" + +#include +#include + +namespace Core { +class GeneratedFile; +} + +namespace Qnx { +namespace Internal { + +class ConvertedProjectContext +{ +public: + void setSrcProjectPath(const QString &p) {m_srcProjectPath = p;} + QString srcProjectPath() const {return m_srcProjectPath;} + void setDestProjectPath(const QString &p) {m_destProjectPath = p;} + QString destProjectPath() const {return m_destProjectPath;} + + QString projectName() const; + const QStringList& collectedFiles() const {return m_collectedFiles;} + void setCollectedFiles(const QStringList &files) {m_collectedFiles = files;} + ImportLog& importLog() {return m_importLog;} +private: + QString m_srcProjectPath; + QString m_destProjectPath; + ImportLog m_importLog; + QStringList m_collectedFiles; +}; + +class FileConverter +{ + Q_DECLARE_TR_FUNCTIONS(FileConverter); +public: + FileConverter(ConvertedProjectContext &ctx) : m_convertedProjectContext(ctx) {} + virtual ~FileConverter() {} + + virtual bool convertFile(Core::GeneratedFile &file, QString &errorMessage); +protected: + ConvertedProjectContext& convertedProjectContext() const {return m_convertedProjectContext;} + + bool loadFileContent(Core::GeneratedFile &file, QString &errorMessage); + QByteArray loadFileContent(const QString &filePath, QString &errorMessage); + void logError(const QString &errorMessage); + + ConvertedProjectContext &m_convertedProjectContext; +}; + +} // namespace Internal +} // namespace Qnx + +#endif // QNX_BLACKBERRY_CASCADESPROJECTIMPORT_FILECONVERTER_H diff --git a/src/plugins/qnx/cascadesimport/importlog.cpp b/src/plugins/qnx/cascadesimport/importlog.cpp new file mode 100644 index 00000000000..c19d266dcfa --- /dev/null +++ b/src/plugins/qnx/cascadesimport/importlog.cpp @@ -0,0 +1,152 @@ +/**************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: BlackBerry Limited (blackberry-qt@qnx.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 +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** 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. +** +** 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. +** +****************************************************************************/ + +#include "importlog.h" + +namespace Qnx { +namespace Internal { + +////////////////////////////////////////////////////////////////////////////// +// +// ImportLogEntry +// +////////////////////////////////////////////////////////////////////////////// +static const char S_ERROR[] = "error"; +static const char S_WARNING[] = "warning"; +static const char S_INFO[] = "info"; +static const char S_DEBUG[] = "debug"; +static const char S_UNDEFINED[] = "undefined"; + +ImportLogEntry::ImportLogEntry(int sev, const QString &msg, const QString &context) +: QVariantList() +{ + reserve(UnusedIx); + append(sev); + append(msg); + append(context); +} + +static const char* severityEnumToStr(ImportLogEntry::Severity sev) +{ + switch (sev) { + case ImportLogEntry::Error: + return S_ERROR; + case ImportLogEntry::Warning: + return S_WARNING; + case ImportLogEntry::Info: + return S_INFO; + case ImportLogEntry::Debug: + return S_DEBUG; + default: + break; + } + return S_UNDEFINED; +} + +ImportLogEntry::Severity ImportLogEntry::severity() const +{ + if (isValid()) + return (Severity)(at(SeverityIx).toInt()); + return Undefined; +} + +QString ImportLogEntry::severityStr() const +{ + return QLatin1String(severityEnumToStr(severity())); +} + +QChar ImportLogEntry::severityAbbr() const +{ + return severityStr().at(0).toUpper(); +} + +QString ImportLogEntry::message() const +{ + if (isValid()) + return at(MessageIx).toString(); + return QString(); +} + +QString ImportLogEntry::context() const +{ + if (isValid()) + return at(ContextIx).toString(); + return QString(); +} + +QString ImportLogEntry::toString() const +{ + QString ret; + if (severity() == Undefined) + ret = message(); + else + ret = QString::fromLatin1("[%1]%2 %3").arg(severityAbbr()).arg(context()).arg(message()); + return ret; +} + +////////////////////////////////////////////////////////////////////////////// +// +// ImportLog +// +////////////////////////////////////////////////////////////////////////////// +QString ImportLog::toString() const +{ + QString ret; + foreach (const ImportLogEntry &sle, *this) + ret += sle.toString() % QLatin1Char('\n'); + return ret; +} + +ImportLog& ImportLog::logError(const QString &msg, const QString &context) +{ + append(ImportLogEntry(ImportLogEntry::Error, msg, context)); + return *this; +} + +ImportLog& ImportLog::logWarning(const QString &msg, const QString &context) +{ + append(ImportLogEntry(ImportLogEntry::Warning, msg, context)); + return *this; +} + +ImportLog& ImportLog::logInfo(const QString &msg, const QString &context) +{ + append(ImportLogEntry(ImportLogEntry::Info, msg, context)); + return *this; +} + +ImportLog& ImportLog::logDebug(const QString &msg, const QString &context) +{ + append(ImportLogEntry(ImportLogEntry::Debug, msg, context)); + return *this; +} + +} // namespace Internal +} // namespace Qnx + diff --git a/src/plugins/qnx/cascadesimport/importlog.h b/src/plugins/qnx/cascadesimport/importlog.h new file mode 100644 index 00000000000..178db98fe36 --- /dev/null +++ b/src/plugins/qnx/cascadesimport/importlog.h @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: BlackBerry Limited (blackberry-qt@qnx.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 +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** 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. +** +** 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. +** +****************************************************************************/ + +#ifndef QNX_BLACKBERRY_CASCADESPROJECTIMPORT_IMPORTLOG_H +#define QNX_BLACKBERRY_CASCADESPROJECTIMPORT_IMPORTLOG_H + +#include + +namespace Qnx { +namespace Internal { + +class ImportLogEntry : public QVariantList +{ +public: + enum Severity {Undefined = 0, Debug, Info, Warning, Error}; + + ImportLogEntry() : QVariantList() {} + ImportLogEntry(int sev, const QString &msg, const QString &context = QString()); + ImportLogEntry(const QVariantList &l) : QVariantList(l) {} + + bool isValid() const {return (count() >= UnusedIx);} + Severity severity() const; + QString severityStr() const; + QChar severityAbbr() const; + QString message() const; + QString context() const; + QString toString() const; +private: + enum FieldIndexes {SeverityIx = 0, MessageIx, ContextIx, UnusedIx}; +}; + +class ImportLog : public QList ///< error list +{ +public: + QString toString() const; + + ImportLog& logError(const QString &msg, const QString &context = QString()); + ImportLog& logWarning(const QString &msg, const QString &context = QString()); + ImportLog& logInfo(const QString &msg, const QString &context = QString()); + ImportLog& logDebug(const QString &msg, const QString &context = QString()); +}; + +} // namespace Internal +} // namespace Qnx + +#endif // QNX_BLACKBERRY_CASCADESPROJECTIMPORT_IMPORTLOG_H diff --git a/src/plugins/qnx/cascadesimport/importlogconverter.cpp b/src/plugins/qnx/cascadesimport/importlogconverter.cpp new file mode 100644 index 00000000000..1e99f35a9c9 --- /dev/null +++ b/src/plugins/qnx/cascadesimport/importlogconverter.cpp @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: BlackBerry Limited (blackberry-qt@qnx.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 +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** 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. +** +** 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. +** +****************************************************************************/ + +#include "importlogconverter.h" + +#include + +#include +#include + +#include + +namespace Qnx { +namespace Internal { + +////////////////////////////////////////////////////////////////////////////// +// +// ImportLogConverter +// +////////////////////////////////////////////////////////////////////////////// +ImportLogConverter::ImportLogConverter(ConvertedProjectContext &ctx) +: FileConverter(ctx) +{ +} + +bool ImportLogConverter::convertFile(Core::GeneratedFile &file, QString &errorMessage) +{ + Q_UNUSED(errorMessage); + QString content; + content += QLatin1String("========================================================\n"); + content += tr("Generated by cascades importer ver: %1, %2\n") + .arg(QLatin1String(Qnx::Constants::QNX_BLACKBERRY_CASCADESIMPORTER_VERSION)) + .arg(QDateTime::currentDateTime().toString(Qt::ISODate)); + content += QLatin1String("========================================================\n\n"); + content += convertedProjectContext().importLog().toString(); + file.setContents(content); + file.setAttributes(file.attributes() | Core::GeneratedFile::OpenEditorAttribute); + return true; +} + +} // namespace Internal +} // namespace Qnx diff --git a/src/plugins/qnx/cascadesimport/importlogconverter.h b/src/plugins/qnx/cascadesimport/importlogconverter.h new file mode 100644 index 00000000000..e2fbb626c33 --- /dev/null +++ b/src/plugins/qnx/cascadesimport/importlogconverter.h @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: BlackBerry Limited (blackberry-qt@qnx.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 +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** 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. +** +** 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. +** +****************************************************************************/ + +#ifndef QNX_BLACKBERRY_CASCADESPROJECTIMPORT_IMPORTLOGCONVERTER_H +#define QNX_BLACKBERRY_CASCADESPROJECTIMPORT_IMPORTLOGCONVERTER_H + +#include "fileconverter.h" + +namespace Qnx { +namespace Internal { + +class ImportLogConverter : public FileConverter +{ + Q_DECLARE_TR_FUNCTIONS(ImportLogConverter); +public: + ImportLogConverter(ConvertedProjectContext &ctx); + virtual ~ImportLogConverter() {} + + bool convertFile(Core::GeneratedFile &file, QString &errorMessage); +}; + +} // namespace Internal +} // namespace Qnx + +#endif // QNX_BLACKBERRY_CASCADESPROJECTIMPORT_IMPORTLOGCONVERTER_H diff --git a/src/plugins/qnx/cascadesimport/projectfileconverter.cpp b/src/plugins/qnx/cascadesimport/projectfileconverter.cpp new file mode 100644 index 00000000000..612160d19eb --- /dev/null +++ b/src/plugins/qnx/cascadesimport/projectfileconverter.cpp @@ -0,0 +1,195 @@ +/**************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: BlackBerry Limited (blackberry-qt@qnx.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 +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** 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. +** +** 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. +** +****************************************************************************/ + +#include "projectfileconverter.h" + +#include + +#include +#include + +#include +#include + +namespace Qnx { +namespace Internal { + +////////////////////////////////////////////////////////////////////////////// +// +// ProjectFileConverter +// +////////////////////////////////////////////////////////////////////////////// +ProjectFileConverter::ProjectFileConverter(ConvertedProjectContext &ctx) +: FileConverter(ctx) +{ +} + +static QMap scanForDefinedVariables(const Core::GeneratedFile &file) +{ + QMap ret; + QString origContent = file.contents(); + QStringList lines = origContent.split(QLatin1Char('\n'), QString::KeepEmptyParts); + QString line; + foreach (QString ln, lines) { + ln = ln.trimmed(); + if (ln.length() && (ln.at(0) == QLatin1Char('#'))) + continue; + if ((line.length() > 0) && (line.at(line.length() - 1) == QLatin1Char('\\'))) { + line = line.mid(line.length() - 1); + line += ln; + } else { + line = ln; + } + if ((line.length() > 0) && (line.at(line.length() - 1) != QLatin1Char('\\'))) { + int ix1 = line.indexOf(QLatin1Char('=')); + if (ix1 > 0) { + int ix2 = (line.at(ix1 - 1) == QLatin1Char('+'))? ix1 - 1: ix1; + QString k = line.mid(0, ix2).trimmed().toUpper(); + QString v = line.mid(ix1 + 1).trimmed(); + if (ix1 != ix2) + v = ret.value(k) % QLatin1Char(' ') % v; + ret[k] = v; + } + } + } + return ret; +} + +static QSet parseVariable(const QString &varStr) +{ + QStringList sl = varStr.split(QLatin1Char(' '), QString::SkipEmptyParts); + QSet ret = QSet::fromList(sl); + return ret; +} + +static QString updateVariable(const QString &varStr, const QString &varsToAdd, + const QString &varsToRemove) +{ + QSet var = parseVariable(varStr); + + QSet ss = parseVariable(varsToAdd); + foreach (QString s, ss) + var << s; + + ss = parseVariable(varsToRemove); + foreach (QString s, ss) + var.remove(s); + + QStringList sl = QStringList::fromSet(var); + return sl.join(QLatin1Char(' ')); +} + +bool ProjectFileConverter::convertFile(Core::GeneratedFile &file, QString &errorMessage) +{ + if (!FileConverter::convertFile(file, errorMessage)) + return false; + + ImportLog &log = convertedProjectContext().importLog(); + QMap origProjectVariables = scanForDefinedVariables(file); + QString fileContent; + + QLatin1String path( ":/qnx/cascadesimport/resources/templates/project.pro"); + QByteArray ba = loadFileContent(path, errorMessage); + if (!errorMessage.isEmpty()) + return false; + fileContent = QString::fromUtf8(ba); + + QStringList headers; + QStringList sources; + QStringList resources; + QStringList otherFiles; + + QSet entries; + foreach (const QString &filePath, convertedProjectContext().collectedFiles()) { + QString ext = filePath.section(QLatin1Char('.'), -1); + if (ext.compare(QLatin1String("c"), Qt::CaseInsensitive) == 0) + sources << filePath; + else if (ext.compare(QLatin1String("cc"), Qt::CaseInsensitive) == 0) + sources << filePath; + else if (ext.compare(QLatin1String("cpp"), Qt::CaseInsensitive) == 0) + sources << filePath; + else if (ext.compare(QLatin1String("h"), Qt::CaseInsensitive) == 0) + headers << filePath; + else if (ext.compare(QLatin1String("hh"), Qt::CaseInsensitive) == 0) + headers << filePath; + else if (ext.compare(QLatin1String("hpp"), Qt::CaseInsensitive) == 0) + headers << filePath; + else if (ext.compare(QLatin1String("qrc"), Qt::CaseInsensitive) == 0) + resources << filePath; + else if (ext.compare(QLatin1String("qml"), Qt::CaseInsensitive) == 0) + otherFiles << filePath; + else if (ext.compare(QLatin1String("js"), Qt::CaseInsensitive) == 0) + otherFiles << filePath; + else if (ext.compare(QLatin1String("ts"), Qt::CaseInsensitive) == 0) + otherFiles << filePath; + else if (ext.compare(QLatin1String("pro"), Qt::CaseInsensitive) == 0) + otherFiles << filePath; + else if (filePath.compare(QLatin1String("bar-descriptor.xml"), Qt::CaseInsensitive) == 0) + otherFiles << filePath; + else if (filePath.startsWith(QLatin1String("assets/"), Qt::CaseInsensitive)) + // include all the content of the assets directory + otherFiles << filePath; + else if (filePath.startsWith(QLatin1String("src/"), Qt::CaseInsensitive)) + // include all the content of the src directory + otherFiles << filePath; + else if (ext.compare(QLatin1String("log"), Qt::CaseInsensitive) != 0) + log.logWarning(tr("File '%1' not listed in '%2' file, should it be?") + .arg(filePath).arg(file.path())); + } + + fileContent.replace(QLatin1String("%HEADERS%"), headers.join(QLatin1String(" \\\n "))); + fileContent.replace(QLatin1String("%SOURCES%"), sources.join(QLatin1String(" \\\n "))); + fileContent.replace(QLatin1String("%RESOURCES%"), resources.join(QLatin1String(" \\\n "))); + fileContent.replace(QLatin1String("%OTHER_FILES%"), otherFiles.join(QLatin1String(" \\\n "))); + fileContent.replace(QLatin1String("%PROJECT_NAME%"), convertedProjectContext().projectName()); + fileContent.replace(QLatin1String("%TARGET%"), origProjectVariables.value(QLatin1String("TARGET"), + convertedProjectContext().projectName())); + fileContent.replace(QLatin1String("%EXTRA_LIBS%"), origProjectVariables.value(QLatin1String("LIBS"))); + fileContent.replace(QLatin1String("%IMPORTER_VERSION%"), + QLatin1String(Qnx::Constants::QNX_BLACKBERRY_CASCADESIMPORTER_VERSION)); + fileContent.replace(QLatin1String("%DATE_TIME%"), + QDateTime::currentDateTime().toString(Qt::ISODate)); + fileContent.replace(QLatin1String("%QT%"), + updateVariable(origProjectVariables.value(QLatin1String("QT")), + QLatin1String("declarative script svg sql network xml xmlpatterns"), + QString() + )); + fileContent.replace(QLatin1String("%CONFIG%"), + updateVariable(origProjectVariables.value(QLatin1String("CONFIG")), + QLatin1String("qt warn_on"), + QLatin1String("debug release debug_and_release cascades cascades10") + )); + fileContent.replace(QLatin1String("%MOBILITY%"), origProjectVariables.value(QLatin1String("MOBILITY"))); + file.setContents(fileContent); + file.setAttributes(file.attributes() | Core::GeneratedFile::OpenProjectAttribute); + return errorMessage.isEmpty(); +} + +} // namespace Internal +} // namespace Qnx diff --git a/src/plugins/qnx/cascadesimport/projectfileconverter.h b/src/plugins/qnx/cascadesimport/projectfileconverter.h new file mode 100644 index 00000000000..96f92a6e644 --- /dev/null +++ b/src/plugins/qnx/cascadesimport/projectfileconverter.h @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: BlackBerry Limited (blackberry-qt@qnx.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 +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** 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. +** +** 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. +** +****************************************************************************/ + +#ifndef QNX_BLACKBERRY_CASCADESPROJECTIMPORT_PROJECTFILECONVERTER_H +#define QNX_BLACKBERRY_CASCADESPROJECTIMPORT_PROJECTFILECONVERTER_H + +#include "fileconverter.h" + +#include + +#include +#include + +namespace Qnx { +namespace Internal { + +class ProjectFileConverter : public FileConverter +{ + Q_DECLARE_TR_FUNCTIONS(ProjectFileConverter); +public: + ProjectFileConverter(ConvertedProjectContext &ctx); + virtual ~ProjectFileConverter() {} + + bool convertFile(Core::GeneratedFile &file, QString &errorMessage); +private: + QMap definedVariables(const Core::GeneratedFile &file); +}; + +} // namespace Internal +} // namespace Qnx + +#endif // QNX_BLACKBERRY_CASCADESPROJECTIMPORT_PROJECTFILECONVERTER_H diff --git a/src/plugins/qnx/cascadesimport/resources/templates/project.pro b/src/plugins/qnx/cascadesimport/resources/templates/project.pro new file mode 100644 index 00000000000..485b979688f --- /dev/null +++ b/src/plugins/qnx/cascadesimport/resources/templates/project.pro @@ -0,0 +1,46 @@ +#======================================================================================== +# generated by CascadesProjectImporter ver. %IMPORTER_VERSION% - %DATE_TIME% +#======================================================================================== + +TEMPLATE = app +TARGET = %TARGET% + +CONFIG += %CONFIG% + +# For cascades integration, some additional libraries are needed +# and the library path needs to be set +LIBS += -lbb -lbbcascades +LIBS += %EXTRA_LIBS% + +QT -= gui +QT += %QT% + +MOBILITY += %MOBILITY% + +QMAKE_CFLAGS += -Wno-psabi +QMAKE_CXXFLAGS += -Wno-psabi + +CONFIG(release, debug|release) { + zygotize { + TEMPLATE = lib + QMAKE_CFLAGS += -fstack-protector-strong -fvisibility=hidden -mthumb -Os + QMAKE_CXXFLAGS += -fstack-protector-strong -fvisibility=hidden -mthumb -Os + QMAKE_LFLAGS += -Wl,-z,relro + DEFINES += _FORTIFY_SOURCE=2 + } +} + +INCLUDEPATH += src + +HEADERS += \ + %HEADERS% + +SOURCES += \ + %SOURCES% + +RESOURCES += \ + %RESOURCES% + +OTHER_FILES += \ + bar-descriptor.xml \ + %OTHER_FILES% diff --git a/src/plugins/qnx/cascadesimport/srcprojectwizardpage.cpp b/src/plugins/qnx/cascadesimport/srcprojectwizardpage.cpp new file mode 100644 index 00000000000..b9617a1b9ef --- /dev/null +++ b/src/plugins/qnx/cascadesimport/srcprojectwizardpage.cpp @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: BlackBerry Limited (blackberry-qt@qnx.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 +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** 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. +** +** 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. +** +****************************************************************************/ + +#include "srcprojectwizardpage.h" +#include "ui_srcprojectwizardpage.h" + +#include + +namespace Qnx { +namespace Internal { + +SrcProjectWizardPage::SrcProjectWizardPage(QWidget *parent) + : QWizardPage(parent), m_complete(false) +{ + ui = new Ui::SrcProjectWizardPage; + ui->setupUi(this); + + connect(ui->pathChooser, SIGNAL(pathChanged(QString)), this, SLOT(onPathChooserPathChanged(QString))); + + setPath(QDir::homePath()); +} + +SrcProjectWizardPage::~SrcProjectWizardPage() +{ + delete ui; +} + +void SrcProjectWizardPage::onPathChooserPathChanged(const QString &newPath) +{ + bool newComplete = ui->pathChooser->isValid(); + if (newComplete != m_complete) { + m_complete = newComplete; + emit completeChanged(); + } + if (newComplete) emit validPathChanged(newPath); +} + +QString SrcProjectWizardPage::projectName() const +{ + return path().section(QLatin1Char('/'), -1); +} + +QString SrcProjectWizardPage::path() const +{ + return Utils::FileName::fromUserInput(ui->pathChooser->path()).toString(); +} + +void SrcProjectWizardPage::setPath(const QString &path) +{ + ui->pathChooser->setPath(path); +} + +bool SrcProjectWizardPage::isComplete() const +{ + return m_complete; +} + +} // namespace Internal +} // namespace Qnx diff --git a/src/plugins/qnx/cascadesimport/srcprojectwizardpage.h b/src/plugins/qnx/cascadesimport/srcprojectwizardpage.h new file mode 100644 index 00000000000..7284854117e --- /dev/null +++ b/src/plugins/qnx/cascadesimport/srcprojectwizardpage.h @@ -0,0 +1,64 @@ +/**************************************************************************** +** +** Copyright (C) 2013 BlackBerry Limited. All rights reserved. +** Contact: BlackBerry Limited (blackberry-qt@qnx.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 +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** 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. +** +** 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. +** +****************************************************************************/ + +#ifndef QNX_BLACKBERRY_CASCADESPROJECTIMPORT_SRCPROJECTWIZARDPAGE_H +#define QNX_BLACKBERRY_CASCADESPROJECTIMPORT_SRCPROJECTWIZARDPAGE_H + +#include + +namespace Qnx { +namespace Internal { + +namespace Ui { class SrcProjectWizardPage; } + +class SrcProjectWizardPage : public QWizardPage +{ + Q_OBJECT +public: + explicit SrcProjectWizardPage(QWidget *parent = 0); + virtual ~SrcProjectWizardPage(); + + QString projectName() const; + QString path() const; + void setPath(const QString &path); + + bool isComplete() const; +signals: + void validPathChanged(const QString &path); +private slots: + void onPathChooserPathChanged(const QString &newPath); +private: + Ui::SrcProjectWizardPage *ui; + bool m_complete; +}; + +} // namespace Internal +} // namespace Qnx + +#endif // QNX_BLACKBERRY_CASCADESPROJECTIMPORT_SRCPROJECTWIZARDPAGE_H diff --git a/src/plugins/qnx/cascadesimport/srcprojectwizardpage.ui b/src/plugins/qnx/cascadesimport/srcprojectwizardpage.ui new file mode 100644 index 00000000000..93489094417 --- /dev/null +++ b/src/plugins/qnx/cascadesimport/srcprojectwizardpage.ui @@ -0,0 +1,42 @@ + + + Qnx::Internal::SrcProjectWizardPage + + + + 0 + 0 + 520 + 147 + + + + Choose the Location + + + + QFormLayout::ExpandingFieldsGrow + + + + + Project path: + + + + + + + + + + + Utils::PathChooser + QWidget +
utils/pathchooser.h
+ 1 +
+
+ + +
diff --git a/src/plugins/qnx/qnx.pro b/src/plugins/qnx/qnx.pro index 07b4b573615..c6edbf0faa6 100644 --- a/src/plugins/qnx/qnx.pro +++ b/src/plugins/qnx/qnx.pro @@ -226,6 +226,7 @@ FORMS += \ blackberryinstallwizardprocesspage.ui include(../../private_headers.pri) +include(./cascadesimport/cascadesimport.pri) greaterThan(QT_MAJOR_VERSION, 4) { QT += gui-private diff --git a/src/plugins/qnx/qnx.qbs b/src/plugins/qnx/qnx.qbs index b8a6db083ac..5fdba888845 100644 --- a/src/plugins/qnx/qnx.qbs +++ b/src/plugins/qnx/qnx.qbs @@ -239,4 +239,31 @@ QtcPlugin { "images/target-small.png", "images/target.png", ] + + Group { + name: "CascadesImport" + prefix: "cascadesimport/" + files: [ + "cascadesimport.qrc", + + "srcprojectwizardpage.ui", + + "cascadesimportwizard.cpp", + "srcprojectwizardpage.cpp", + "fileconverter.cpp", + "bardescriptorconverter.cpp", + "projectfileconverter.cpp", + "importlogconverter.cpp", + "importlog.cpp", + + "cascadesimportwizard.h", + "srcprojectwizardpage.h", + "fileconverter.h", + "bardescriptorconverter.h", + "projectfileconverter.h", + "importlogconverter.h", + "importlog.h", + ] + } + } diff --git a/src/plugins/qnx/qnxconstants.h b/src/plugins/qnx/qnxconstants.h index 4e8decda6f7..456fd5488cc 100644 --- a/src/plugins/qnx/qnxconstants.h +++ b/src/plugins/qnx/qnxconstants.h @@ -108,6 +108,8 @@ const char QNX_KEY_ACTIVE[] = "active"; const char QNX_BLACKBERRY_DEPLOY_CMD[] = "blackberry-deploy"; +const char QNX_BLACKBERRY_CASCADESIMPORTER_VERSION[] = "0.0.1"; + } // namespace Constants } // namespace Qnx diff --git a/src/plugins/qnx/qnxplugin.cpp b/src/plugins/qnx/qnxplugin.cpp index 26098b43b9a..dceec615fbe 100644 --- a/src/plugins/qnx/qnxplugin.cpp +++ b/src/plugins/qnx/qnxplugin.cpp @@ -52,6 +52,7 @@ #include "blackberrycheckdevmodestepfactory.h" #include "blackberrydeviceconnectionmanager.h" #include "blackberryconfigurationmanager.h" +#include "cascadesimport/cascadesimportwizard.h" #include #include @@ -89,6 +90,7 @@ bool QNXPlugin::initialize(const QStringList &arguments, QString *errorString) addAutoReleasedObject(new BlackBerryNDKSettingsPage); addAutoReleasedObject(new BlackBerryKeysPage); addAutoReleasedObject(new BlackBerryCheckDevModeStepFactory); + addAutoReleasedObject(new CascadesImportWizard); BlackBerryDeviceConnectionManager::instance()->initialize(); // Handles QNX