2011-02-21 16:30:31 +01:00
|
|
|
/**************************************************************************
|
|
|
|
**
|
2013-02-05 10:31:52 +01:00
|
|
|
** Copyright (C) 2012-2013 Digia Plc and/or its subsidiary(-ies).
|
2012-12-21 10:31:17 +01:00
|
|
|
** Contact: http://www.qt-project.org/legal
|
2011-02-21 16:30:31 +01:00
|
|
|
**
|
2012-12-21 10:31:17 +01:00
|
|
|
** This file is part of the Qt Installer Framework.
|
2011-02-21 16:30:31 +01:00
|
|
|
**
|
2012-12-21 10:31:17 +01:00
|
|
|
** $QT_BEGIN_LICENSE:LGPL$
|
|
|
|
** 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.
|
2011-02-21 16:30:31 +01:00
|
|
|
**
|
|
|
|
** GNU Lesser General Public License Usage
|
2012-12-21 10:31:17 +01:00
|
|
|
** 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
|
2012-02-06 09:58:16 +01:00
|
|
|
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
|
|
**
|
2012-12-21 10:31:17 +01:00
|
|
|
** GNU General Public License Usage
|
|
|
|
** Alternatively, this file may be used under the terms of the GNU
|
|
|
|
** General Public License version 3.0 as published by the Free Software
|
|
|
|
** Foundation and appearing in the file LICENSE.GPL included in the
|
|
|
|
** packaging of this file. Please review the following information to
|
|
|
|
** ensure the GNU General Public License version 3.0 requirements will be
|
|
|
|
** met: http://www.gnu.org/copyleft/gpl.html.
|
2011-02-21 16:30:31 +01:00
|
|
|
**
|
2012-02-06 09:58:16 +01:00
|
|
|
**
|
2012-12-21 10:31:17 +01:00
|
|
|
** $QT_END_LICENSE$
|
2011-02-21 16:30:31 +01:00
|
|
|
**
|
|
|
|
**************************************************************************/
|
2011-06-09 11:54:06 +02:00
|
|
|
#include "component.h"
|
2013-05-08 13:26:41 +02:00
|
|
|
#include "scriptengine.h"
|
2011-02-21 16:30:31 +01:00
|
|
|
|
2012-03-13 16:38:56 +01:00
|
|
|
#include "errors.h"
|
|
|
|
#include "fileutils.h"
|
2013-02-28 17:30:06 +01:00
|
|
|
#include "globals.h"
|
2011-02-21 16:30:31 +01:00
|
|
|
#include "lib7z_facade.h"
|
2011-03-09 12:45:22 +01:00
|
|
|
#include "messageboxhandler.h"
|
2013-06-17 12:40:23 +02:00
|
|
|
#include "packagemanagercore.h"
|
2014-06-02 12:31:17 +02:00
|
|
|
#include "remoteclient.h"
|
2013-06-17 12:40:23 +02:00
|
|
|
#include "settings.h"
|
2011-02-21 16:30:31 +01:00
|
|
|
|
2011-11-19 00:00:52 +01:00
|
|
|
#include <kdupdaterupdatesourcesinfo.h>
|
|
|
|
#include <kdupdaterupdateoperationfactory.h>
|
2011-02-21 16:30:31 +01:00
|
|
|
|
2013-03-05 12:18:37 +01:00
|
|
|
#include <productkeycheck.h>
|
|
|
|
|
2011-03-09 12:45:22 +01:00
|
|
|
#include <QtCore/QDirIterator>
|
|
|
|
#include <QtCore/QTranslator>
|
2011-03-23 21:09:14 +01:00
|
|
|
|
2012-11-19 16:44:52 +01:00
|
|
|
#include <QApplication>
|
2011-03-23 21:09:14 +01:00
|
|
|
|
2011-03-09 12:45:22 +01:00
|
|
|
#include <QtUiTools/QUiLoader>
|
2011-02-21 16:30:31 +01:00
|
|
|
|
2011-04-01 10:20:07 +02:00
|
|
|
#include <algorithm>
|
|
|
|
|
2011-06-06 17:23:48 +02:00
|
|
|
using namespace QInstaller;
|
2011-04-12 15:32:46 +02:00
|
|
|
|
2011-07-05 13:42:31 +02:00
|
|
|
static const QLatin1String scScript("Script");
|
|
|
|
static const QLatin1String scDefault("Default");
|
2011-07-22 14:35:19 +02:00
|
|
|
static const QLatin1String scAutoDependOn("AutoDependOn");
|
2011-07-05 13:42:31 +02:00
|
|
|
static const QLatin1String scVirtual("Virtual");
|
|
|
|
static const QLatin1String scInstalled("Installed");
|
|
|
|
static const QLatin1String scUpdateText("UpdateText");
|
|
|
|
static const QLatin1String scUninstalled("Uninstalled");
|
|
|
|
static const QLatin1String scCurrentState("CurrentState");
|
|
|
|
static const QLatin1String scForcedInstallation("ForcedInstallation");
|
2011-02-21 16:30:31 +01:00
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmltype component
|
2013-02-28 16:32:23 +01:00
|
|
|
\inqmlmodule scripting
|
|
|
|
|
2014-10-07 15:05:08 +02:00
|
|
|
\brief The component type represents the current component that the Qt Script belongs to.
|
2013-02-28 16:32:23 +01:00
|
|
|
|
2014-10-07 15:05:08 +02:00
|
|
|
A minimal valid script needs to contain a constructor, which can look like this:
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
\code
|
|
|
|
function Component()
|
|
|
|
{
|
2014-10-07 15:05:08 +02:00
|
|
|
// Access the global component's name property and log it to the debug console.
|
|
|
|
console.log("component: " + component.displayName);
|
2013-02-28 16:32:23 +01:00
|
|
|
}
|
|
|
|
\endcode
|
2014-10-07 15:05:08 +02:00
|
|
|
|
|
|
|
The \c Component class and the script engine both modify the script before it is evaluated.
|
|
|
|
When the modifications are applied to the above snippet, the script changes to:
|
|
|
|
|
|
|
|
\code
|
|
|
|
(function() { [1]
|
|
|
|
var component = installer.componentByName('Component.Name.This.Script.Belongs.To'); [2]
|
|
|
|
function Component()
|
|
|
|
{
|
|
|
|
// Access the global component's name property and log it to the debug console.
|
|
|
|
console.log("component: " + component.displayName);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (typeof Component != undefined) [1]
|
|
|
|
return new Component; [1]
|
|
|
|
else [1]
|
|
|
|
throw "Missing Component constructor. Please check your script." [1]
|
|
|
|
})();
|
|
|
|
|
|
|
|
[1] Changes done by the script engine.
|
|
|
|
[2] Changes done by the Component class.
|
|
|
|
\endcode
|
|
|
|
|
|
|
|
\note The \e component (in lower case) is the global variable the C++ \c Component class
|
|
|
|
introduced. The \e component variable represents the C++ \c Component object that the script
|
|
|
|
belongs to. The \e Component (in upper case) is a JavaScript object that gets instantiated by
|
|
|
|
the script engine.
|
2013-02-28 16:32:23 +01:00
|
|
|
*/
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlproperty string component::name
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Returns the name of the component as set in the \c <Name> tag of the package
|
|
|
|
information file.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlproperty string component::displayName
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Returns the name of the component as shown in the user interface.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlproperty boolean component::selected
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Indicates whether the component is currently selected.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlproperty boolean component::autoCreateOperations
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Specifies whether some standard operations for the component should be
|
|
|
|
automatically created when the installation starts. The default is \c true.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlproperty stringlist component::archives
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Returns the list of archive URL's (prefixed with \c installer://) registered
|
|
|
|
for the component.
|
|
|
|
|
|
|
|
\sa addDownloadableArchive, removeDownloadableArchive
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlproperty stringlist component::dependencies
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
This read-only property contains components this component depends on.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlproperty stringlist component::autoDependencies
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Returns the value of the \c <AutoDependsOn> tag in the package information file.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlproperty boolean component::fromOnlineRepository
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Returns whether this component has been loaded from an online repository.
|
|
|
|
|
|
|
|
\sa isFromOnlineRepository
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlproperty url component::repositoryUrl
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Returns the repository URL the component is downloaded from.
|
|
|
|
When this component is not downloaded from an online repository, returns an empty #QUrl.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlproperty boolean component::default
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
This read-only property indicates if the component is a default one.
|
|
|
|
|
|
|
|
\note Always \c false for virtual components.
|
|
|
|
|
|
|
|
\sa isDefault
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlproperty boolean component::installed
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
This read-only property returns if the component is installed.
|
|
|
|
|
|
|
|
\sa isInstalled
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlproperty boolean component::enabled
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Indicates whether the component is currently enabled. The property is both readable and writable.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlsignal component::loaded()
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Emitted when the component has been loaded.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlsignal component::selectedChanged(boolean isSelected)
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Emitted when the component selection has changed to \a isSelected.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlsignal component::valueChanged(string key, string value)
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Emitted when the variable with name \a key has changed to \a value.
|
|
|
|
|
|
|
|
\sa setValue
|
2011-02-21 16:30:31 +01:00
|
|
|
*/
|
|
|
|
|
2013-02-28 16:32:23 +01:00
|
|
|
|
2011-02-21 16:30:31 +01:00
|
|
|
/*!
|
2011-03-09 12:45:22 +01:00
|
|
|
Constructor. Creates a new Component inside of \a installer.
|
2011-02-21 16:30:31 +01:00
|
|
|
*/
|
2011-06-14 16:24:50 +02:00
|
|
|
Component::Component(PackageManagerCore *core)
|
|
|
|
: d(new ComponentPrivate(core, this))
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2011-03-23 22:30:29 +01:00
|
|
|
setPrivate(d);
|
2011-04-01 13:55:31 +02:00
|
|
|
|
|
|
|
connect(this, SIGNAL(valueChanged(QString, QString)), this, SLOT(updateModelData(QString, QString)));
|
2013-09-12 18:03:58 +02:00
|
|
|
qRegisterMetaType<QList<QInstaller::Component*> >("QList<QInstaller::Component*>");
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2011-03-09 12:45:22 +01:00
|
|
|
Destroys the Component.
|
2011-02-21 16:30:31 +01:00
|
|
|
*/
|
|
|
|
Component::~Component()
|
|
|
|
{
|
2011-03-09 12:45:22 +01:00
|
|
|
if (parentComponent() != 0)
|
2011-07-21 20:05:08 +02:00
|
|
|
d->m_parentComponent->d->m_allChildComponents.removeAll(this);
|
2011-02-21 16:30:31 +01:00
|
|
|
|
2011-07-26 16:33:11 +02:00
|
|
|
//why can we delete all create operations if the component gets destroyed
|
2011-02-21 16:30:31 +01:00
|
|
|
if (!d->m_newlyInstalled)
|
2011-04-13 11:06:16 +02:00
|
|
|
qDeleteAll(d->m_operations);
|
2011-02-21 16:30:31 +01:00
|
|
|
|
2012-01-24 15:48:10 +01:00
|
|
|
//we need to copy the list, because we are changing it with removeAll at top
|
|
|
|
//(this made the iterators broken in the past)
|
|
|
|
QList<Component*> copiedChildrenList = d->m_allChildComponents;
|
|
|
|
copiedChildrenList.detach(); //this makes it a real copy
|
|
|
|
|
|
|
|
qDeleteAll(copiedChildrenList);
|
2011-02-21 16:30:31 +01:00
|
|
|
delete d;
|
2012-01-24 15:48:10 +01:00
|
|
|
d = 0;
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
2011-07-05 13:22:05 +02:00
|
|
|
void Component::loadDataFromPackage(const LocalPackage &package)
|
2011-03-10 18:36:07 +01:00
|
|
|
{
|
2011-07-05 13:22:05 +02:00
|
|
|
setValue(scName, package.name);
|
2011-06-30 14:03:22 +02:00
|
|
|
// pixmap ???
|
2011-07-05 13:22:05 +02:00
|
|
|
setValue(scDisplayName, package.title);
|
|
|
|
setValue(scDescription, package.description);
|
|
|
|
setValue(scVersion, package.version);
|
2011-10-13 13:28:59 +02:00
|
|
|
setValue(scInheritVersion, package.inheritVersionFrom);
|
2011-07-05 13:22:05 +02:00
|
|
|
setValue(scInstalledVersion, package.version);
|
|
|
|
setValue(QLatin1String("LastUpdateDate"), package.lastUpdateDate.toString());
|
|
|
|
setValue(QLatin1String("InstallDate"), package.installDate.toString());
|
|
|
|
setValue(scUncompressedSize, QString::number(package.uncompressedSize));
|
2011-03-11 12:39:45 +01:00
|
|
|
|
2011-11-25 14:09:06 +01:00
|
|
|
QString dependstr;
|
2011-08-11 19:29:53 +02:00
|
|
|
foreach (const QString &val, package.dependencies)
|
2011-03-11 12:39:45 +01:00
|
|
|
dependstr += val + QLatin1String(",");
|
|
|
|
|
2011-07-05 13:22:05 +02:00
|
|
|
if (package.dependencies.count() > 0)
|
2011-03-10 18:36:07 +01:00
|
|
|
dependstr.chop(1);
|
2011-06-06 17:23:48 +02:00
|
|
|
setValue(scDependencies, dependstr);
|
2011-03-11 12:39:45 +01:00
|
|
|
|
2011-07-05 13:22:05 +02:00
|
|
|
setValue(scForcedInstallation, package.forcedInstallation ? scTrue : scFalse);
|
|
|
|
if (package.forcedInstallation & !PackageManagerCore::noForceInstallation()) {
|
2011-04-12 11:21:20 +02:00
|
|
|
setEnabled(false);
|
|
|
|
setCheckable(false);
|
|
|
|
setCheckState(Qt::Checked);
|
2011-03-16 10:22:13 +01:00
|
|
|
}
|
2011-07-05 13:22:05 +02:00
|
|
|
setValue(scVirtual, package.virtualComp ? scTrue : scFalse);
|
2011-06-30 14:03:22 +02:00
|
|
|
setValue(scCurrentState, scInstalled);
|
2011-03-10 18:36:07 +01:00
|
|
|
}
|
|
|
|
|
2011-07-05 13:22:05 +02:00
|
|
|
void Component::loadDataFromPackage(const Package &package)
|
2011-03-10 18:36:07 +01:00
|
|
|
{
|
2011-07-05 13:22:05 +02:00
|
|
|
Q_ASSERT(&package);
|
|
|
|
|
|
|
|
setValue(scName, package.data(scName).toString());
|
|
|
|
setValue(scDisplayName, package.data(scDisplayName).toString());
|
|
|
|
setValue(scDescription, package.data(scDescription).toString());
|
|
|
|
setValue(scDefault, package.data(scDefault).toString());
|
2011-07-29 11:39:34 +02:00
|
|
|
setValue(scAutoDependOn, package.data(scAutoDependOn).toString());
|
2013-07-29 15:27:51 +02:00
|
|
|
setValue(scCompressedSize, package.data(scCompressedSize).toString());
|
|
|
|
setValue(scUncompressedSize, package.data(scUncompressedSize).toString());
|
2011-10-13 13:50:57 +02:00
|
|
|
setValue(scRemoteVersion, package.data(scRemoteVersion).toString());
|
2011-10-13 13:28:59 +02:00
|
|
|
setValue(scInheritVersion, package.data(scInheritVersion).toString());
|
2011-07-05 13:22:05 +02:00
|
|
|
setValue(scDependencies, package.data(scDependencies).toString());
|
2011-11-15 14:57:59 +01:00
|
|
|
setValue(scDownloadableArchives, package.data(scDownloadableArchives).toString());
|
2011-07-05 13:22:05 +02:00
|
|
|
setValue(scVirtual, package.data(scVirtual).toString());
|
|
|
|
setValue(scSortingPriority, package.data(scSortingPriority).toString());
|
|
|
|
|
2011-09-27 09:14:45 +02:00
|
|
|
setValue(scEssential, package.data(scEssential).toString());
|
2011-07-05 13:22:05 +02:00
|
|
|
setValue(scUpdateText, package.data(scUpdateText).toString());
|
|
|
|
setValue(scNewComponent, package.data(scNewComponent).toString());
|
|
|
|
setValue(scRequiresAdminRights, package.data(scRequiresAdminRights).toString());
|
|
|
|
|
|
|
|
setValue(scScript, package.data(scScript).toString());
|
|
|
|
setValue(scReplaces, package.data(scReplaces).toString());
|
|
|
|
setValue(scReleaseDate, package.data(scReleaseDate).toString());
|
|
|
|
|
|
|
|
QString forced = package.data(scForcedInstallation, scFalse).toString().toLower();
|
2011-06-14 16:24:50 +02:00
|
|
|
if (PackageManagerCore::noForceInstallation())
|
2011-06-06 17:23:48 +02:00
|
|
|
forced = scFalse;
|
|
|
|
setValue(scForcedInstallation, forced);
|
|
|
|
if (forced == scTrue) {
|
2011-04-12 11:21:20 +02:00
|
|
|
setEnabled(false);
|
|
|
|
setCheckable(false);
|
|
|
|
setCheckState(Qt::Checked);
|
|
|
|
}
|
2011-03-10 18:36:07 +01:00
|
|
|
|
2013-05-27 15:52:31 +02:00
|
|
|
setLocalTempPath(QInstaller::pathFromUrl(package.sourceInfoUrl()));
|
2013-02-28 17:30:06 +01:00
|
|
|
const QStringList uis = package.data(QLatin1String("UserInterfaces")).toString()
|
|
|
|
.split(QInstaller::commaRegExp(), QString::SkipEmptyParts);
|
2011-03-17 15:13:11 +01:00
|
|
|
if (!uis.isEmpty())
|
|
|
|
loadUserInterfaces(QDir(QString::fromLatin1("%1/%2").arg(localTempPath(), name())), uis);
|
2011-03-10 18:36:07 +01:00
|
|
|
|
2013-02-28 17:30:06 +01:00
|
|
|
const QStringList qms = package.data(QLatin1String("Translations")).toString()
|
|
|
|
.split(QInstaller::commaRegExp(), QString::SkipEmptyParts);
|
2011-03-17 15:13:11 +01:00
|
|
|
if (!qms.isEmpty())
|
|
|
|
loadTranslations(QDir(QString::fromLatin1("%1/%2").arg(localTempPath(), name())), qms);
|
2011-03-10 18:36:07 +01:00
|
|
|
|
2011-07-05 13:22:05 +02:00
|
|
|
QHash<QString, QVariant> licenseHash = package.data(QLatin1String("Licenses")).toHash();
|
2011-03-17 15:13:11 +01:00
|
|
|
if (!licenseHash.isEmpty())
|
|
|
|
loadLicenses(QString::fromLatin1("%1/%2/").arg(localTempPath(), name()), licenseHash);
|
2011-03-10 18:36:07 +01:00
|
|
|
}
|
|
|
|
|
2012-01-05 15:18:16 +01:00
|
|
|
quint64 Component::updateUncompressedSize()
|
|
|
|
{
|
|
|
|
quint64 size = 0;
|
|
|
|
|
2014-07-21 15:07:00 +02:00
|
|
|
if (installationRequested() || updateRequested())
|
2013-02-19 20:18:01 +01:00
|
|
|
size = d->m_vars.value(scUncompressedSize).toLongLong();
|
2012-01-05 15:18:16 +01:00
|
|
|
|
|
|
|
foreach (Component* comp, d->m_allChildComponents)
|
|
|
|
size += comp->updateUncompressedSize();
|
|
|
|
|
|
|
|
setValue(scUncompressedSizeSum, QString::number(size));
|
2012-03-21 14:28:40 +01:00
|
|
|
setData(humanReadableSize(size), UncompressedSize);
|
2012-01-05 15:18:16 +01:00
|
|
|
|
|
|
|
return size;
|
|
|
|
}
|
|
|
|
|
2011-02-21 16:30:31 +01:00
|
|
|
void Component::markAsPerformedInstallation()
|
|
|
|
{
|
|
|
|
d->m_newlyInstalled = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2011-03-09 12:45:22 +01:00
|
|
|
Returns a key/value based hash of all variables set for this component.
|
|
|
|
*/
|
2011-02-21 16:30:31 +01:00
|
|
|
QHash<QString,QString> Component::variables() const
|
|
|
|
{
|
|
|
|
return d->m_vars;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod string component::value(string key, string value = "")
|
2013-02-28 16:32:23 +01:00
|
|
|
|
2013-02-19 20:18:01 +01:00
|
|
|
Returns the value of variable name \a key. If \a key is not known yet, \a defaultValue is returned.
|
|
|
|
Note: If a component is virtual and you ask for the component value with key "Default", it will always
|
2013-02-28 16:32:23 +01:00
|
|
|
return \c false.
|
2011-03-09 12:45:22 +01:00
|
|
|
*/
|
|
|
|
QString Component::value(const QString &key, const QString &defaultValue) const
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2013-02-19 20:18:01 +01:00
|
|
|
if (key == scDefault)
|
|
|
|
return isDefault() ? scTrue : scFalse;
|
2011-02-21 16:30:31 +01:00
|
|
|
return d->m_vars.value(key, defaultValue);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod void component::setValue(string key, string value)
|
2013-02-28 16:32:23 +01:00
|
|
|
|
2011-03-09 12:45:22 +01:00
|
|
|
Sets the value of the variable with \a key to \a value.
|
2011-02-21 16:30:31 +01:00
|
|
|
*/
|
|
|
|
void Component::setValue(const QString &key, const QString &value)
|
|
|
|
{
|
2012-05-25 13:34:00 +02:00
|
|
|
QString normalizedValue = d->m_core->replaceVariables(value);
|
|
|
|
|
|
|
|
if (d->m_vars.value(key) == normalizedValue)
|
2011-02-21 16:30:31 +01:00
|
|
|
return;
|
|
|
|
|
2011-06-09 16:47:41 +02:00
|
|
|
if (key == scName)
|
2012-05-25 13:34:00 +02:00
|
|
|
d->m_componentName = normalizedValue;
|
2011-06-01 18:18:58 +02:00
|
|
|
|
2012-05-25 13:34:00 +02:00
|
|
|
d->m_vars[key] = normalizedValue;
|
|
|
|
emit valueChanged(key, normalizedValue);
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2011-04-21 10:19:02 +02:00
|
|
|
Returns the installer this component belongs to.
|
2011-02-21 16:30:31 +01:00
|
|
|
*/
|
2011-06-14 16:24:50 +02:00
|
|
|
PackageManagerCore *Component::packageManagerCore() const
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2011-06-14 16:24:50 +02:00
|
|
|
return d->m_core;
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2013-04-30 11:47:06 +02:00
|
|
|
Returns the parent of this component. If this component is org.qt-project.sdk.qt, its
|
|
|
|
parent is org.qt-project.sdk, as far as this exists.
|
2011-03-09 12:45:22 +01:00
|
|
|
*/
|
2011-08-11 19:29:53 +02:00
|
|
|
Component *Component::parentComponent() const
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2011-04-13 11:06:16 +02:00
|
|
|
return d->m_parentComponent;
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
Appends \a component as a child of this component. If \a component already has a parent,
|
2012-09-28 10:50:46 +02:00
|
|
|
it is removed from the previous parent. If the \a component has as sorting priority set, the child list
|
|
|
|
is sorted in case of multiple components (high goes on top).
|
2011-03-09 12:45:22 +01:00
|
|
|
*/
|
2011-08-11 19:29:53 +02:00
|
|
|
void Component::appendComponent(Component *component)
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2014-09-22 15:44:29 +02:00
|
|
|
if (d->m_core->isUpdater())
|
|
|
|
throw Error(tr("Components cannot have children in updater mode."));
|
|
|
|
|
2011-06-06 12:41:02 +02:00
|
|
|
if (!component->isVirtual()) {
|
2011-07-21 20:05:08 +02:00
|
|
|
d->m_childComponents.append(component);
|
2012-09-28 10:50:46 +02:00
|
|
|
std::sort(d->m_childComponents.begin(), d->m_childComponents.end(), SortingPriorityGreaterThan());
|
2011-04-01 10:20:07 +02:00
|
|
|
} else {
|
2011-07-21 20:05:08 +02:00
|
|
|
d->m_virtualChildComponents.append(component);
|
2011-04-01 10:20:07 +02:00
|
|
|
}
|
|
|
|
|
2011-07-21 20:05:08 +02:00
|
|
|
d->m_allChildComponents = d->m_childComponents + d->m_virtualChildComponents;
|
2011-04-01 10:20:07 +02:00
|
|
|
if (Component *parent = component->parentComponent())
|
|
|
|
parent->removeComponent(component);
|
2011-04-13 11:06:16 +02:00
|
|
|
component->d->m_parentComponent = this;
|
2011-07-21 20:05:08 +02:00
|
|
|
setTristate(d->m_childComponents.count() > 0);
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
2011-04-01 10:21:34 +02:00
|
|
|
/*!
|
|
|
|
Removes \a component if it is a child of this component. The component object still exists after the
|
2011-08-11 19:29:53 +02:00
|
|
|
function returns. It's up to the caller to delete the passed \a component.
|
2011-04-01 10:21:34 +02:00
|
|
|
*/
|
|
|
|
void Component::removeComponent(Component *component)
|
|
|
|
{
|
|
|
|
if (component->parentComponent() == this) {
|
2011-04-13 11:06:16 +02:00
|
|
|
component->d->m_parentComponent = 0;
|
2011-07-21 20:05:08 +02:00
|
|
|
d->m_childComponents.removeAll(component);
|
|
|
|
d->m_virtualChildComponents.removeAll(component);
|
|
|
|
d->m_allChildComponents = d->m_childComponents + d->m_virtualChildComponents;
|
2011-04-01 10:21:34 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-02-21 16:30:31 +01:00
|
|
|
/*!
|
2013-02-19 16:03:35 +01:00
|
|
|
Returns a list of child components. If \a kind is set to DirectChildrenOnly, the returned list contains
|
|
|
|
only the direct children, if set to Descendants it will also include all descendants of the components
|
|
|
|
children. Note: The returned list does include ALL children, non virtual components as well as virtual
|
|
|
|
components.
|
2011-03-09 12:45:22 +01:00
|
|
|
*/
|
2013-02-19 16:03:35 +01:00
|
|
|
QList<Component *> Component::childComponents(Kind kind) const
|
2011-03-09 12:45:22 +01:00
|
|
|
{
|
2013-02-18 16:43:09 +01:00
|
|
|
if (d->m_core->isUpdater())
|
2013-02-19 16:03:35 +01:00
|
|
|
return QList<Component*>();
|
2011-03-09 12:45:22 +01:00
|
|
|
|
2013-02-19 16:03:35 +01:00
|
|
|
QList<Component *> result = d->m_allChildComponents;
|
2013-02-20 11:24:48 +01:00
|
|
|
if (kind == DirectChildrenOnly)
|
2013-02-19 16:03:35 +01:00
|
|
|
return result;
|
2011-02-21 16:30:31 +01:00
|
|
|
|
2013-02-19 16:03:35 +01:00
|
|
|
foreach (Component *component, d->m_allChildComponents)
|
|
|
|
result += component->childComponents(kind);
|
2011-02-21 16:30:31 +01:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2011-03-09 12:45:22 +01:00
|
|
|
Contains this component's name (unique identifier).
|
|
|
|
*/
|
2011-02-21 16:30:31 +01:00
|
|
|
QString Component::name() const
|
|
|
|
{
|
2011-06-06 14:21:12 +02:00
|
|
|
return d->m_componentName;
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2011-03-09 12:45:22 +01:00
|
|
|
Contains this component's display name (as visible to the user).
|
|
|
|
*/
|
2011-02-21 16:30:31 +01:00
|
|
|
QString Component::displayName() const
|
|
|
|
{
|
2013-02-19 20:18:01 +01:00
|
|
|
return d->m_vars.value(scDisplayName);
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
2011-03-15 18:17:20 +01:00
|
|
|
void Component::loadComponentScript()
|
|
|
|
{
|
2013-02-19 20:18:01 +01:00
|
|
|
const QString script = d->m_vars.value(scScript);
|
2011-03-17 15:13:11 +01:00
|
|
|
if (!localTempPath().isEmpty() && !script.isEmpty())
|
|
|
|
loadComponentScript(QString::fromLatin1("%1/%2/%3").arg(localTempPath(), name(), script));
|
2011-03-15 18:17:20 +01:00
|
|
|
}
|
|
|
|
|
2011-02-21 16:30:31 +01:00
|
|
|
/*!
|
2013-05-08 13:26:41 +02:00
|
|
|
Loads the script at \a fileName into ScriptEngine. The installer and all its
|
2011-03-09 12:45:22 +01:00
|
|
|
components as well as other useful stuff are being exported into the script.
|
|
|
|
Read \link componentscripting Component Scripting \endlink for details.
|
2013-02-28 16:32:23 +01:00
|
|
|
Throws an error when either the script at \a fileName couldn't be opened, or the QScriptEngine
|
2011-03-09 12:45:22 +01:00
|
|
|
couldn't evaluate the script.
|
|
|
|
*/
|
|
|
|
void Component::loadComponentScript(const QString &fileName)
|
|
|
|
{
|
2013-05-17 15:57:24 +02:00
|
|
|
// introduce the component object as javascript value and call the name to check that it
|
|
|
|
// was successful
|
2014-06-02 15:14:12 +02:00
|
|
|
d->m_scriptContext = d->scriptEngine()->loadInContext(QLatin1String("Component"), fileName,
|
|
|
|
QString::fromLatin1("var component = installer.componentByName('%1'); component.name;")
|
|
|
|
.arg(name()));
|
2011-08-24 19:06:20 +02:00
|
|
|
|
2011-02-21 16:30:31 +01:00
|
|
|
emit loaded();
|
|
|
|
languageChanged();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2011-03-09 12:45:22 +01:00
|
|
|
\internal
|
|
|
|
Calls the script method \link retranslateUi() \endlink, if any. This is done whenever a
|
|
|
|
QTranslator file is being loaded.
|
|
|
|
*/
|
2011-02-21 16:30:31 +01:00
|
|
|
void Component::languageChanged()
|
|
|
|
{
|
2013-11-06 12:45:23 +01:00
|
|
|
d->scriptEngine()->callScriptMethod(d->m_scriptContext, QLatin1String("retranslateUi"));
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2011-03-09 12:45:22 +01:00
|
|
|
Loads the translations matching the name filters \a qms inside \a directory. Only translations
|
|
|
|
with a \link QFileInfo::baseName() baseName \endlink matching the current locales \link
|
|
|
|
QLocale::name() name \endlink are loaded.
|
2013-02-28 16:32:23 +01:00
|
|
|
Read \l componenttranslation for details.
|
2011-03-09 12:45:22 +01:00
|
|
|
*/
|
2011-08-11 19:29:53 +02:00
|
|
|
void Component::loadTranslations(const QDir &directory, const QStringList &qms)
|
2011-03-09 12:45:22 +01:00
|
|
|
{
|
|
|
|
QDirIterator it(directory.path(), qms, QDir::Files);
|
2013-06-17 12:40:23 +02:00
|
|
|
const QStringList translations = d->m_core->settings().translations();
|
|
|
|
const QString uiLanguage = QLocale().uiLanguages().value(0, QLatin1String("en_us"))
|
|
|
|
.replace(QLatin1Char('-'), QLatin1Char('_'));
|
2011-03-09 12:45:22 +01:00
|
|
|
while (it.hasNext()) {
|
2011-02-21 16:30:31 +01:00
|
|
|
const QString filename = it.next();
|
2013-06-17 12:40:23 +02:00
|
|
|
const QString basename = QFileInfo(filename).baseName();
|
|
|
|
if (!uiLanguage.startsWith(QFileInfo(filename).baseName(), Qt::CaseInsensitive))
|
|
|
|
continue; // do not load the file if it does not match the UI language
|
|
|
|
|
|
|
|
if (!translations.isEmpty()) {
|
|
|
|
bool found = false;
|
|
|
|
foreach (const QString &translation, translations)
|
|
|
|
found |= translation.startsWith(basename, Qt::CaseInsensitive);
|
|
|
|
if (!found) // don't load the file if it does match the UI language but is not allowed to be used
|
|
|
|
continue;
|
|
|
|
}
|
2011-02-21 16:30:31 +01:00
|
|
|
|
2011-03-09 12:45:22 +01:00
|
|
|
QScopedPointer<QTranslator> translator(new QTranslator(this));
|
|
|
|
if (!translator->load(filename))
|
2013-03-25 15:29:46 +01:00
|
|
|
throw Error(tr("Could not open the requested translation file '%1'.").arg(filename));
|
2011-03-09 12:45:22 +01:00
|
|
|
qApp->installTranslator(translator.take());
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2011-03-09 12:45:22 +01:00
|
|
|
Loads the user interface files matching the name filters \a uis inside \a directory. The loaded
|
|
|
|
interface can be accessed via userInterfaces by using the class name set in the ui file.
|
2013-02-28 16:32:23 +01:00
|
|
|
Read \l componentuserinterfaces for details.
|
2011-03-09 12:45:22 +01:00
|
|
|
*/
|
2011-08-11 19:29:53 +02:00
|
|
|
void Component::loadUserInterfaces(const QDir &directory, const QStringList &uis)
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2012-12-06 15:47:26 +01:00
|
|
|
if (qobject_cast<QApplication*> (qApp) == 0)
|
|
|
|
return;
|
2011-02-21 16:30:31 +01:00
|
|
|
|
2011-03-09 12:45:22 +01:00
|
|
|
QDirIterator it(directory.path(), uis, QDir::Files);
|
|
|
|
while (it.hasNext()) {
|
|
|
|
QFile file(it.next());
|
|
|
|
if (!file.open(QIODevice::ReadOnly)) {
|
2013-03-25 15:29:46 +01:00
|
|
|
throw Error(tr("Could not open the requested UI file '%1'. Error: %2").arg(it.fileName(),
|
2011-03-09 12:45:22 +01:00
|
|
|
file.errorString()));
|
|
|
|
}
|
2011-02-21 16:30:31 +01:00
|
|
|
|
|
|
|
static QUiLoader loader;
|
2011-03-09 12:45:22 +01:00
|
|
|
loader.setTranslationEnabled(true);
|
|
|
|
loader.setLanguageChangeEnabled(true);
|
2013-06-18 11:21:28 +02:00
|
|
|
QWidget *const widget = loader.load(&file, 0);
|
2013-03-25 15:29:46 +01:00
|
|
|
if (!widget) {
|
|
|
|
throw Error(tr("Could not load the requested UI file '%1'. Error: %2").arg(it.fileName(),
|
|
|
|
loader.errorString()));
|
|
|
|
}
|
|
|
|
d->m_userInterfaces.insert(widget->objectName(), widget);
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-02-15 10:05:12 +01:00
|
|
|
/*!
|
|
|
|
Loads the text of the Licenses contained in the licenseHash.
|
|
|
|
This is saved into a new hash containing the filename and the text of that file.
|
|
|
|
*/
|
2011-02-21 16:30:31 +01:00
|
|
|
void Component::loadLicenses(const QString &directory, const QHash<QString, QVariant> &licenseHash)
|
|
|
|
{
|
|
|
|
QHash<QString, QVariant>::const_iterator it;
|
|
|
|
for (it = licenseHash.begin(); it != licenseHash.end(); ++it) {
|
|
|
|
const QString &fileName = it.value().toString();
|
2013-03-05 12:18:37 +01:00
|
|
|
|
2013-11-25 16:53:04 +01:00
|
|
|
if (!ProductKeyCheck::instance()->isValidLicenseTextFile(fileName))
|
2013-03-05 12:18:37 +01:00
|
|
|
continue;
|
|
|
|
|
2012-02-15 11:21:35 +01:00
|
|
|
QFileInfo fileInfo(fileName);
|
|
|
|
QFile file(QString::fromLatin1("%1%2_%3.%4").arg(directory, fileInfo.baseName(),
|
|
|
|
QLocale().name().toLower(), fileInfo.completeSuffix()));
|
2011-03-09 12:45:22 +01:00
|
|
|
if (!file.open(QIODevice::ReadOnly)) {
|
2012-02-15 11:21:35 +01:00
|
|
|
// No translated license, use untranslated file
|
|
|
|
qDebug("Unable to open translated license file. Using untranslated fallback.");
|
|
|
|
file.setFileName(directory + fileName);
|
|
|
|
if (!file.open(QIODevice::ReadOnly)) {
|
2013-03-25 15:29:46 +01:00
|
|
|
throw Error(tr("Could not open the requested license file '%1'. Error: %2").arg(fileName,
|
2012-02-15 11:21:35 +01:00
|
|
|
file.errorString()));
|
|
|
|
}
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
2013-01-24 11:03:19 +04:00
|
|
|
QTextStream stream(&file);
|
|
|
|
stream.setCodec("UTF-8");
|
|
|
|
d->m_licenses.insert(it.key(), qMakePair(fileName, stream.readAll()));
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-02-28 16:32:23 +01:00
|
|
|
|
2011-02-21 16:30:31 +01:00
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlproperty stringlist component::userInterfaces
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Returns a list of all user interface class names known to this component.
|
2011-03-09 12:45:22 +01:00
|
|
|
*/
|
2011-02-21 16:30:31 +01:00
|
|
|
QStringList Component::userInterfaces() const
|
|
|
|
{
|
2011-04-13 11:06:16 +02:00
|
|
|
return d->m_userInterfaces.keys();
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
QHash<QString, QPair<QString, QString> > Component::licenses() const
|
|
|
|
{
|
|
|
|
return d->m_licenses;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod QWidget component::userInterface(string name)
|
2013-02-28 16:32:23 +01:00
|
|
|
|
2011-11-08 16:38:47 +01:00
|
|
|
Returns the QWidget created for \a name or 0 if the widget already has been deleted or cannot be found.
|
2011-03-09 12:45:22 +01:00
|
|
|
*/
|
2011-08-11 19:29:53 +02:00
|
|
|
QWidget *Component::userInterface(const QString &name) const
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2011-11-08 16:38:47 +01:00
|
|
|
return d->m_userInterfaces.value(name).data();
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod void component::createOperationsForPath(string path)
|
2013-02-28 16:32:23 +01:00
|
|
|
|
2011-03-09 12:45:22 +01:00
|
|
|
Creates all operations needed to install this component's \a path. \a path is a full qualified
|
2013-02-28 16:32:23 +01:00
|
|
|
filename including the component's name. This method gets called from
|
2014-10-07 15:05:08 +02:00
|
|
|
component::createOperationsForArchive. You can override it by providing a method with
|
2011-03-09 12:45:22 +01:00
|
|
|
the same name in the component script.
|
|
|
|
|
|
|
|
\note RSA signature files are omitted by this method.
|
|
|
|
\note If you call this method from a script, it won't call the scripts method with the same name.
|
2011-02-21 16:30:31 +01:00
|
|
|
|
2011-04-21 10:19:02 +02:00
|
|
|
The default implementation is recursively creating Copy and Mkdir operations for all files
|
2011-03-09 12:45:22 +01:00
|
|
|
and folders within \a path.
|
|
|
|
*/
|
|
|
|
void Component::createOperationsForPath(const QString &path)
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2011-03-09 12:45:22 +01:00
|
|
|
const QFileInfo fi(path);
|
2011-02-21 16:30:31 +01:00
|
|
|
|
2012-03-05 13:31:22 +01:00
|
|
|
// don't copy over a checksum file
|
|
|
|
if (fi.suffix() == QLatin1String("sha1") && QFileInfo(fi.dir(), fi.completeBaseName()).exists())
|
2011-02-21 16:30:31 +01:00
|
|
|
return;
|
|
|
|
|
|
|
|
// the script can override this method
|
2014-06-02 15:14:12 +02:00
|
|
|
if (!d->scriptEngine()->callScriptMethod(d->m_scriptContext,
|
|
|
|
QLatin1String("createOperationsForPath"), QJSValueList() << path).isUndefined()) {
|
|
|
|
return;
|
2013-05-08 13:26:41 +02:00
|
|
|
}
|
2011-02-21 16:30:31 +01:00
|
|
|
|
|
|
|
QString target;
|
2012-04-13 14:18:48 +02:00
|
|
|
static const QString prefix = QString::fromLatin1("installer://");
|
|
|
|
target = QString::fromLatin1("@TargetDir@%1").arg(path.mid(prefix.length() + name().length()));
|
2011-03-09 12:45:22 +01:00
|
|
|
|
|
|
|
if (fi.isFile()) {
|
|
|
|
static const QString copy = QString::fromLatin1("Copy");
|
|
|
|
addOperation(copy, fi.filePath(), target);
|
|
|
|
} else if (fi.isDir()) {
|
2011-02-21 16:30:31 +01:00
|
|
|
qApp->processEvents();
|
2011-03-09 12:45:22 +01:00
|
|
|
static const QString mkdir = QString::fromLatin1("Mkdir");
|
|
|
|
addOperation(mkdir, target);
|
2011-02-21 16:30:31 +01:00
|
|
|
|
2011-03-09 12:45:22 +01:00
|
|
|
QDirIterator it(fi.filePath());
|
|
|
|
while (it.hasNext())
|
|
|
|
createOperationsForPath(it.next());
|
|
|
|
}
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod void component::createOperationsForArchive(string archive)
|
2013-02-28 16:32:23 +01:00
|
|
|
|
2011-10-19 15:14:29 +02:00
|
|
|
Creates all operations needed to install this component's \a archive. This method gets called
|
2014-10-07 15:05:08 +02:00
|
|
|
from component::createOperations. You can override this method by providing a method with the
|
2011-03-09 12:45:22 +01:00
|
|
|
same name in the component script.
|
|
|
|
|
|
|
|
\note If you call this method from a script, it won't call the scripts method with the same name.
|
|
|
|
|
|
|
|
The default implementation calls createOperationsForPath for everything contained in the archive.
|
|
|
|
If \a archive is a compressed archive known to the installer system, an Extract operation is
|
|
|
|
created, instead.
|
|
|
|
*/
|
|
|
|
void Component::createOperationsForArchive(const QString &archive)
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2013-03-05 15:15:02 +01:00
|
|
|
const QFileInfo fi(archive);
|
|
|
|
|
|
|
|
// don't do anything with sha1 files
|
|
|
|
if (fi.suffix() == QLatin1String("sha1") && QFileInfo(fi.dir(), fi.completeBaseName()).exists())
|
|
|
|
return;
|
|
|
|
|
2011-02-21 16:30:31 +01:00
|
|
|
// the script can override this method
|
2014-06-02 15:14:12 +02:00
|
|
|
if (!d->scriptEngine()->callScriptMethod(d->m_scriptContext,
|
|
|
|
QLatin1String("createOperationsForArchive"), QJSValueList() << archive).isUndefined()) {
|
|
|
|
return;
|
2013-05-08 13:26:41 +02:00
|
|
|
}
|
2011-02-21 16:30:31 +01:00
|
|
|
|
2012-04-13 14:21:50 +02:00
|
|
|
const bool isZip = Lib7z::isSupportedArchive(archive);
|
2011-02-21 16:30:31 +01:00
|
|
|
|
2011-03-09 12:45:22 +01:00
|
|
|
if (isZip) {
|
2011-02-21 16:30:31 +01:00
|
|
|
// archives get completely extracted per default (if the script isn't doing other stuff)
|
2012-04-13 14:21:50 +02:00
|
|
|
addOperation(QLatin1String("Extract"), archive, QLatin1String("@TargetDir@"));
|
2011-03-09 12:45:22 +01:00
|
|
|
} else {
|
2012-04-13 14:21:50 +02:00
|
|
|
createOperationsForPath(archive);
|
2011-03-09 12:45:22 +01:00
|
|
|
}
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
2013-02-28 16:32:23 +01:00
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod void component::beginInstallation()
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Starts the component installation.
|
|
|
|
You can override this method by providing a method with the same name in the component script.
|
|
|
|
|
|
|
|
\code
|
|
|
|
Component.prototype.beginInstallation = function()
|
|
|
|
{
|
|
|
|
// call default implementation
|
|
|
|
component.beginInstallation();
|
|
|
|
// ...
|
|
|
|
}
|
|
|
|
\endcode
|
|
|
|
|
|
|
|
*/
|
2011-11-17 12:33:51 +01:00
|
|
|
void Component::beginInstallation()
|
|
|
|
{
|
|
|
|
// the script can override this method
|
2014-06-02 15:14:12 +02:00
|
|
|
d->scriptEngine()->callScriptMethod(d->m_scriptContext, QLatin1String("beginInstallation"));
|
2011-11-17 12:33:51 +01:00
|
|
|
}
|
|
|
|
|
2011-02-21 16:30:31 +01:00
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod void component::createOperations()
|
2013-02-28 16:32:23 +01:00
|
|
|
|
2011-03-09 12:45:22 +01:00
|
|
|
Creates all operations needed to install this component.
|
|
|
|
You can override this method by providing a method with the same name in the component script.
|
|
|
|
|
|
|
|
\note If you call this method from a script, it won't call the scripts method with the same name.
|
|
|
|
|
|
|
|
The default implementation calls createOperationsForArchive for all archives in this component.
|
2011-02-21 16:30:31 +01:00
|
|
|
*/
|
|
|
|
void Component::createOperations()
|
|
|
|
{
|
|
|
|
// the script can override this method
|
2014-06-02 15:14:12 +02:00
|
|
|
if (!d->scriptEngine()->callScriptMethod(d->m_scriptContext, QLatin1String("createOperations"))
|
|
|
|
.isUndefined()) {
|
|
|
|
d->m_operationsCreated = true;
|
|
|
|
return;
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
2011-03-09 12:45:22 +01:00
|
|
|
foreach (const QString &archive, archives())
|
|
|
|
createOperationsForArchive(archive);
|
2011-02-21 16:30:31 +01:00
|
|
|
|
2011-04-13 11:06:16 +02:00
|
|
|
d->m_operationsCreated = true;
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod void component::registerPathForUninstallation(string path, boolean wipe = false)
|
2013-02-28 16:32:23 +01:00
|
|
|
|
2011-03-09 12:45:22 +01:00
|
|
|
Registers the file or directory at \a path for being removed when this component gets uninstalled.
|
2013-02-28 16:32:23 +01:00
|
|
|
In case of a directory, this will be recursive. If \a wipe is set to \c true, the directory will
|
2011-03-09 12:45:22 +01:00
|
|
|
also be deleted if it contains changes done by the user after installation.
|
2011-02-21 16:30:31 +01:00
|
|
|
*/
|
2011-03-09 12:45:22 +01:00
|
|
|
void Component::registerPathForUninstallation(const QString &path, bool wipe)
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2014-07-02 12:38:39 +02:00
|
|
|
d->m_pathsForUninstallation.append(qMakePair(path, wipe));
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2011-04-21 10:19:02 +02:00
|
|
|
Returns the list of paths previously registered for uninstallation with
|
2011-03-09 12:45:22 +01:00
|
|
|
#registerPathForUninstallation.
|
2011-02-21 16:30:31 +01:00
|
|
|
*/
|
2014-07-02 12:38:39 +02:00
|
|
|
QList<QPair<QString, bool> > Component::pathsForUninstallation() const
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2014-07-02 12:38:39 +02:00
|
|
|
return d->m_pathsForUninstallation;
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2012-04-13 14:21:50 +02:00
|
|
|
Contains the names of all archives known to this component. Even downloaded archives are mapped
|
|
|
|
to the installer:// url throw the used QFileEngineHandler during the download process.
|
2011-03-09 12:45:22 +01:00
|
|
|
*/
|
2011-02-21 16:30:31 +01:00
|
|
|
QStringList Component::archives() const
|
|
|
|
{
|
2012-04-13 14:21:50 +02:00
|
|
|
QString pathString = QString::fromLatin1("installer://%1/").arg(name());
|
|
|
|
QStringList archivesNameList = QDir(pathString).entryList();
|
|
|
|
//RegExp "^" means line beginning
|
|
|
|
archivesNameList.replaceInStrings(QRegExp(QLatin1String("^")), pathString);
|
|
|
|
return archivesNameList;
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod void component::addDownloadableArchive(string path)
|
2013-02-28 16:32:23 +01:00
|
|
|
|
2011-03-09 12:45:22 +01:00
|
|
|
Adds the archive \a path to this component. This can only be called when this component was
|
|
|
|
downloaded from an online repository. When adding \a path, it will be downloaded from the
|
|
|
|
repository when the installation starts.
|
|
|
|
|
2013-02-28 16:32:23 +01:00
|
|
|
\sa removeDownloadableArchive, fromOnlineRepository, archives
|
2011-03-09 12:45:22 +01:00
|
|
|
*/
|
|
|
|
void Component::addDownloadableArchive(const QString &path)
|
|
|
|
{
|
|
|
|
Q_ASSERT(isFromOnlineRepository());
|
|
|
|
|
2012-01-16 23:42:54 +01:00
|
|
|
qDebug() << "addDownloadable" << path;
|
2013-02-19 20:18:01 +01:00
|
|
|
d->m_downloadableArchives.append(d->m_vars.value(scRemoteVersion) + path);
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
2011-03-09 12:45:22 +01:00
|
|
|
|
2011-02-21 16:30:31 +01:00
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod void component::removeDownloadableArchive(string path)
|
2013-02-28 16:32:23 +01:00
|
|
|
|
2011-03-09 12:45:22 +01:00
|
|
|
Removes the archive \a path previously added via addDownloadableArchive from this component.
|
2011-10-19 15:14:29 +02:00
|
|
|
This can only be called when this component was downloaded from an online repository.
|
2011-03-09 12:45:22 +01:00
|
|
|
|
2013-02-28 16:32:23 +01:00
|
|
|
\sa addDownloadableArchive, fromOnlineRepository, archives
|
2011-03-09 12:45:22 +01:00
|
|
|
*/
|
|
|
|
void Component::removeDownloadableArchive(const QString &path)
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2011-03-09 12:45:22 +01:00
|
|
|
Q_ASSERT(isFromOnlineRepository());
|
2011-04-13 11:06:16 +02:00
|
|
|
d->m_downloadableArchives.removeAll(path);
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2011-03-09 12:45:22 +01:00
|
|
|
Returns the archives to be downloaded from the online repository before installation.
|
|
|
|
*/
|
2011-02-21 16:30:31 +01:00
|
|
|
QStringList Component::downloadableArchives() const
|
|
|
|
{
|
2011-04-13 11:06:16 +02:00
|
|
|
return d->m_downloadableArchives;
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod void component::addStopProcessForUpdateRequest(string process)
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Adds a request for quitting the process \a process before installing/updating/uninstalling the
|
2011-03-09 12:45:22 +01:00
|
|
|
component.
|
|
|
|
*/
|
|
|
|
void Component::addStopProcessForUpdateRequest(const QString &process)
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2011-04-13 11:06:16 +02:00
|
|
|
d->m_stopProcessForUpdateRequests.append(process);
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod void component::removeStopProcessForUpdateRequest(string process)
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Removes the request for quitting the process \a process again.
|
2011-02-21 16:30:31 +01:00
|
|
|
*/
|
2011-03-09 12:45:22 +01:00
|
|
|
void Component::removeStopProcessForUpdateRequest(const QString &process)
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2011-04-13 11:06:16 +02:00
|
|
|
d->m_stopProcessForUpdateRequests.removeAll(process);
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod void component::setStopProcessForUpdateRequest(string process, boolean requested)
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Convenience: Add/remove request depending on \a requested (add if \c true, remove if \c false).
|
2011-02-21 16:30:31 +01:00
|
|
|
*/
|
2011-03-09 12:45:22 +01:00
|
|
|
void Component::setStopProcessForUpdateRequest(const QString &process, bool requested)
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2011-03-09 12:45:22 +01:00
|
|
|
if (requested)
|
|
|
|
addStopProcessForUpdateRequest(process);
|
2011-02-21 16:30:31 +01:00
|
|
|
else
|
2011-03-09 12:45:22 +01:00
|
|
|
removeStopProcessForUpdateRequest(process);
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2011-03-09 12:45:22 +01:00
|
|
|
The list of processes this component needs to be closed before installing/updating/uninstalling
|
|
|
|
*/
|
2011-02-21 16:30:31 +01:00
|
|
|
QStringList Component::stopProcessForUpdateRequests() const
|
|
|
|
{
|
2011-04-13 11:06:16 +02:00
|
|
|
return d->m_stopProcessForUpdateRequests;
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2013-02-28 16:32:23 +01:00
|
|
|
Returns the operations needed to install this component. If autoCreateOperations is \c true,
|
2011-03-09 12:45:22 +01:00
|
|
|
createOperations is called, if no operations have been auto-created yet.
|
|
|
|
*/
|
2011-07-05 10:02:02 +02:00
|
|
|
OperationList Component::operations() const
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2011-04-13 11:06:16 +02:00
|
|
|
if (d->m_autoCreateOperations && !d->m_operationsCreated) {
|
2011-03-09 12:45:22 +01:00
|
|
|
const_cast<Component*>(this)->createOperations();
|
2011-02-21 16:30:31 +01:00
|
|
|
|
2011-04-13 11:06:16 +02:00
|
|
|
if (!d->m_minimumProgressOperation) {
|
|
|
|
d->m_minimumProgressOperation = KDUpdater::UpdateOperationFactory::instance()
|
2011-02-21 16:30:31 +01:00
|
|
|
.create(QLatin1String("MinimumProgress"));
|
2013-09-17 09:07:05 +02:00
|
|
|
d->m_minimumProgressOperation->setValue(QLatin1String("component"), name());
|
2011-04-13 11:06:16 +02:00
|
|
|
d->m_operations.append(d->m_minimumProgressOperation);
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!d->m_licenses.isEmpty()) {
|
|
|
|
d->m_licenseOperation = KDUpdater::UpdateOperationFactory::instance()
|
|
|
|
.create(QLatin1String("License"));
|
2011-06-14 16:24:50 +02:00
|
|
|
d->m_licenseOperation->setValue(QLatin1String("installer"), QVariant::fromValue(d->m_core));
|
2013-09-17 09:07:05 +02:00
|
|
|
d->m_licenseOperation->setValue(QLatin1String("component"), name());
|
2011-02-21 16:30:31 +01:00
|
|
|
|
|
|
|
QVariantMap licenses;
|
|
|
|
const QList<QPair<QString, QString> > values = d->m_licenses.values();
|
|
|
|
for (int i = 0; i < values.count(); ++i)
|
|
|
|
licenses.insert(values.at(i).first, values.at(i).second);
|
|
|
|
d->m_licenseOperation->setValue(QLatin1String("licenses"), licenses);
|
2011-04-13 11:06:16 +02:00
|
|
|
d->m_operations.append(d->m_licenseOperation);
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
}
|
2011-04-13 11:06:16 +02:00
|
|
|
return d->m_operations;
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2011-03-09 12:45:22 +01:00
|
|
|
Adds \a operation to the list of operations needed to install this component.
|
|
|
|
*/
|
2011-07-04 23:40:17 +02:00
|
|
|
void Component::addOperation(Operation *operation)
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2011-04-13 11:06:16 +02:00
|
|
|
d->m_operations.append(operation);
|
2014-06-02 12:31:17 +02:00
|
|
|
if (RemoteClient::instance().isActive())
|
2011-03-09 12:45:22 +01:00
|
|
|
operation->setValue(QLatin1String("admin"), true);
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2011-03-09 12:45:22 +01:00
|
|
|
Adds \a operation to the list of operations needed to install this component. \a operation
|
|
|
|
is executed with elevated rights.
|
|
|
|
*/
|
2011-07-04 23:40:17 +02:00
|
|
|
void Component::addElevatedOperation(Operation *operation)
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2011-11-08 14:36:12 +01:00
|
|
|
if (value(scRequiresAdminRights, scFalse) != scTrue) {
|
2013-06-27 14:25:19 +02:00
|
|
|
qWarning() << QString::fromLatin1("Component %1 uses addElevatedOperation in the script, "
|
|
|
|
"but it does not have the needed RequiresAdminRights tag"
|
|
|
|
).arg(name());
|
2011-11-08 14:36:12 +01:00
|
|
|
}
|
2011-03-09 12:45:22 +01:00
|
|
|
addOperation(operation);
|
|
|
|
operation->setValue(QLatin1String("admin"), true);
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
bool Component::operationsCreatedSuccessfully() const
|
|
|
|
{
|
2011-04-13 11:06:16 +02:00
|
|
|
return d->m_operationsCreatedSuccessfully;
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
2013-07-25 17:39:29 +02:00
|
|
|
Operation *Component::createOperation(const QString &operationName, const QString ¶meter1,
|
2011-07-04 23:40:17 +02:00
|
|
|
const QString ¶meter2, const QString ¶meter3, const QString ¶meter4, const QString ¶meter5,
|
|
|
|
const QString ¶meter6, const QString ¶meter7, const QString ¶meter8, const QString ¶meter9,
|
2011-03-09 12:45:22 +01:00
|
|
|
const QString ¶meter10)
|
|
|
|
{
|
2011-02-21 16:30:31 +01:00
|
|
|
QStringList arguments;
|
2011-03-09 12:45:22 +01:00
|
|
|
if (!parameter1.isNull())
|
|
|
|
arguments.append(parameter1);
|
|
|
|
if (!parameter2.isNull())
|
|
|
|
arguments.append(parameter2);
|
|
|
|
if (!parameter3.isNull())
|
|
|
|
arguments.append(parameter3);
|
|
|
|
if (!parameter4.isNull())
|
|
|
|
arguments.append(parameter4);
|
|
|
|
if (!parameter5.isNull())
|
|
|
|
arguments.append(parameter5);
|
|
|
|
if (!parameter6.isNull())
|
|
|
|
arguments.append(parameter6);
|
|
|
|
if (!parameter7.isNull())
|
|
|
|
arguments.append(parameter7);
|
|
|
|
if (!parameter8.isNull())
|
|
|
|
arguments.append(parameter8);
|
|
|
|
if (!parameter9.isNull())
|
|
|
|
arguments.append(parameter9);
|
|
|
|
if (!parameter10.isNull())
|
|
|
|
arguments.append(parameter10);
|
2012-04-27 09:19:03 +02:00
|
|
|
|
2013-07-25 17:39:29 +02:00
|
|
|
return createOperation(operationName, arguments);
|
2012-04-27 09:19:03 +02:00
|
|
|
}
|
|
|
|
|
2013-07-25 17:39:29 +02:00
|
|
|
Operation *Component::createOperation(const QString &operationName, const QStringList ¶meters)
|
2012-04-27 09:19:03 +02:00
|
|
|
{
|
2013-07-25 17:39:29 +02:00
|
|
|
Operation *operation = KDUpdater::UpdateOperationFactory::instance().create(operationName);
|
|
|
|
if (operation == 0) {
|
2012-04-27 09:19:03 +02:00
|
|
|
const QMessageBox::StandardButton button =
|
|
|
|
MessageBoxHandler::critical(MessageBoxHandler::currentBestSuitParent(),
|
|
|
|
QLatin1String("OperationDoesNotExistError"), tr("Error"), tr("Error: Operation %1 does not exist")
|
2013-07-25 17:39:29 +02:00
|
|
|
.arg(operationName), QMessageBox::Abort | QMessageBox::Ignore);
|
2012-04-27 09:19:03 +02:00
|
|
|
if (button == QMessageBox::Abort)
|
|
|
|
d->m_operationsCreatedSuccessfully = false;
|
2013-07-25 17:39:29 +02:00
|
|
|
return operation;
|
2012-04-27 09:19:03 +02:00
|
|
|
}
|
|
|
|
|
2013-07-25 17:39:29 +02:00
|
|
|
if (operation->name() == QLatin1String("Delete"))
|
|
|
|
operation->setValue(QLatin1String("performUndo"), false);
|
|
|
|
operation->setValue(QLatin1String("installer"), qVariantFromValue(d->m_core));
|
2012-04-27 09:19:03 +02:00
|
|
|
|
2013-07-25 17:39:29 +02:00
|
|
|
operation->setArguments(d->m_core->replaceVariables(parameters));
|
2013-07-25 17:59:02 +02:00
|
|
|
operation->setValue(QLatin1String("component"), name());
|
2013-07-25 17:39:29 +02:00
|
|
|
return operation;
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
2012-04-27 09:19:03 +02:00
|
|
|
|
2011-02-21 16:30:31 +01:00
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod boolean component::addOperation(string operation, string parameter1 = "", string parameter2 = "", ..., string parameter10 = "")
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Convenience method for calling addOperation(string, stringlist) with up to 10 arguments.
|
2011-03-09 12:45:22 +01:00
|
|
|
*/
|
2011-07-04 23:40:17 +02:00
|
|
|
bool Component::addOperation(const QString &operation, const QString ¶meter1, const QString ¶meter2,
|
|
|
|
const QString ¶meter3, const QString ¶meter4, const QString ¶meter5, const QString ¶meter6,
|
|
|
|
const QString ¶meter7, const QString ¶meter8, const QString ¶meter9, const QString ¶meter10)
|
2011-03-09 12:45:22 +01:00
|
|
|
{
|
2011-07-04 23:40:17 +02:00
|
|
|
if (Operation *op = createOperation(operation, parameter1, parameter2, parameter3, parameter4, parameter5,
|
|
|
|
parameter6, parameter7, parameter8, parameter9, parameter10)) {
|
2011-03-09 12:45:22 +01:00
|
|
|
addOperation(op);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
2013-02-28 16:32:23 +01:00
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod boolean component::addOperation(string operation, stringlist parameters)
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Creates and adds an installation operation for \a operation. Add any number of parameters.
|
|
|
|
The contents of the parameters get variables like "@TargetDir@" replaced with their values,
|
|
|
|
if contained.
|
|
|
|
*/
|
2012-04-27 09:19:03 +02:00
|
|
|
bool Component::addOperation(const QString &operation, const QStringList ¶meters)
|
|
|
|
{
|
|
|
|
if (Operation *op = createOperation(operation, parameters)) {
|
|
|
|
addOperation(op);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2011-03-09 12:45:22 +01:00
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod boolean component::addElevatedOperation(string operation, string parameter1 = "", string parameter2 = "", ..., string parameter10 = "")
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Convenience method for calling addElevatedOperation(string, stringlist) with up to 10 arguments.
|
2011-03-09 12:45:22 +01:00
|
|
|
*/
|
2011-06-14 16:24:50 +02:00
|
|
|
bool Component::addElevatedOperation(const QString &operation, const QString ¶meter1,
|
|
|
|
const QString ¶meter2, const QString ¶meter3, const QString ¶meter4, const QString ¶meter5,
|
|
|
|
const QString ¶meter6, const QString ¶meter7, const QString ¶meter8, const QString ¶meter9,
|
|
|
|
const QString ¶meter10)
|
2011-03-09 12:45:22 +01:00
|
|
|
{
|
2011-07-04 23:40:17 +02:00
|
|
|
if (Operation *op = createOperation(operation, parameter1, parameter2, parameter3, parameter4, parameter5,
|
|
|
|
parameter6, parameter7, parameter8, parameter9, parameter10)) {
|
2011-03-09 12:45:22 +01:00
|
|
|
addElevatedOperation(op);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
2011-02-21 16:30:31 +01:00
|
|
|
|
2013-02-28 16:32:23 +01:00
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod boolean component::addElevatedOperation(string operation, stringlist parameters)
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Creates and adds an installation operation for \a operation. Add any number of parameters.
|
|
|
|
The contents of the parameters get variables like "@TargetDir@" replaced with their values,
|
|
|
|
if contained. \a operation is executed with elevated rights.
|
|
|
|
|
|
|
|
*/
|
2012-04-27 09:19:03 +02:00
|
|
|
bool Component::addElevatedOperation(const QString &operation, const QStringList ¶meters)
|
|
|
|
{
|
|
|
|
if (Operation *op = createOperation(operation, parameters)) {
|
|
|
|
addElevatedOperation(op);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2011-02-21 16:30:31 +01:00
|
|
|
/*!
|
2011-04-21 10:19:02 +02:00
|
|
|
Specifies whether operations should be automatically created when the installation starts. This
|
2013-02-28 16:32:23 +01:00
|
|
|
would be done by calling #createOperations. If you set this to \c false, it is completely up to the
|
2011-03-09 12:45:22 +01:00
|
|
|
component's script to create all operations.
|
|
|
|
*/
|
2011-02-21 16:30:31 +01:00
|
|
|
bool Component::autoCreateOperations() const
|
|
|
|
{
|
2011-04-13 11:06:16 +02:00
|
|
|
return d->m_autoCreateOperations;
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
2013-02-28 16:32:23 +01:00
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod void component::setAutoCreateOperations(boolean autoCreateOperations)
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Setter for the \l autoCreateOperations property.
|
|
|
|
*/
|
2011-03-09 12:45:22 +01:00
|
|
|
void Component::setAutoCreateOperations(bool autoCreateOperations)
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2011-04-13 11:06:16 +02:00
|
|
|
d->m_autoCreateOperations = autoCreateOperations;
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
2011-06-06 12:41:02 +02:00
|
|
|
bool Component::isVirtual() const
|
|
|
|
{
|
2013-02-19 20:18:01 +01:00
|
|
|
return d->m_vars.value(scVirtual, scFalse).toLower() == scTrue;
|
2011-06-06 12:41:02 +02:00
|
|
|
}
|
|
|
|
|
2011-02-21 16:30:31 +01:00
|
|
|
/*!
|
2013-02-28 16:32:23 +01:00
|
|
|
Specifies whether this component is selected for installation.
|
2011-03-09 12:45:22 +01:00
|
|
|
*/
|
2011-04-12 12:04:55 +02:00
|
|
|
bool Component::isSelected() const
|
2011-03-09 12:45:22 +01:00
|
|
|
{
|
2011-04-05 17:53:34 +02:00
|
|
|
return checkState() != Qt::Unchecked;
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
2011-06-07 12:39:52 +02:00
|
|
|
bool Component::forcedInstallation() const
|
|
|
|
{
|
2013-02-19 20:18:01 +01:00
|
|
|
return d->m_vars.value(scForcedInstallation, scFalse).toLower() == scTrue;
|
2011-06-07 12:39:52 +02:00
|
|
|
}
|
|
|
|
|
2012-04-25 13:21:12 +02:00
|
|
|
void Component::setValidatorCallbackName(const QString &name)
|
|
|
|
{
|
|
|
|
validatorCallbackName = name;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Component::validatePage()
|
|
|
|
{
|
|
|
|
if (!validatorCallbackName.isEmpty())
|
2014-06-02 15:14:12 +02:00
|
|
|
return d->scriptEngine()->callScriptMethod(d->m_scriptContext, validatorCallbackName).toBool();
|
2012-04-25 13:21:12 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2011-03-09 12:45:22 +01:00
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod void component::setSelected(boolean selected)
|
2013-02-28 16:32:23 +01:00
|
|
|
|
2011-04-12 12:04:55 +02:00
|
|
|
Marks the component for installation. Emits the selectedChanged() signal if the check state changes.
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
\note This method does not do anything and is deprecated since 1.3.
|
2011-03-09 12:45:22 +01:00
|
|
|
*/
|
2011-04-12 12:04:55 +02:00
|
|
|
void Component::setSelected(bool selected)
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2011-06-06 12:24:50 +02:00
|
|
|
Q_UNUSED(selected)
|
2013-03-19 14:34:20 +01:00
|
|
|
qDebug() << Q_FUNC_INFO << QString::fromLatin1("on '%1' is deprecated.").arg(d->m_componentName);
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
2013-02-28 16:32:23 +01:00
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod void component::addDependency(string newDependency)
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Adds a new component \a newDependency to the list of dependencies.
|
|
|
|
|
|
|
|
\sa dependencies
|
|
|
|
*/
|
|
|
|
|
2011-11-17 12:30:51 +01:00
|
|
|
void Component::addDependency(const QString &newDependency)
|
|
|
|
{
|
2013-02-19 20:18:01 +01:00
|
|
|
QString oldDependencies = d->m_vars.value(scDependencies);
|
2011-11-17 12:30:51 +01:00
|
|
|
if (oldDependencies.isEmpty())
|
|
|
|
setValue(scDependencies, newDependency);
|
|
|
|
else
|
|
|
|
setValue(scDependencies, oldDependencies + QLatin1String(", ") + newDependency);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-02-21 16:30:31 +01:00
|
|
|
/*!
|
2011-03-09 12:45:22 +01:00
|
|
|
Contains this component dependencies.
|
2013-02-28 16:32:23 +01:00
|
|
|
Read \l componentdependencies for details.
|
2011-03-09 12:45:22 +01:00
|
|
|
*/
|
2011-02-21 16:30:31 +01:00
|
|
|
QStringList Component::dependencies() const
|
|
|
|
{
|
2013-02-28 17:30:06 +01:00
|
|
|
return d->m_vars.value(scDependencies).split(QInstaller::commaRegExp(), QString::SkipEmptyParts);
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
2011-08-23 16:12:50 +02:00
|
|
|
QStringList Component::autoDependencies() const
|
|
|
|
{
|
2011-09-16 12:20:27 +02:00
|
|
|
QStringList autoDependencyStringList =
|
2013-02-28 17:30:06 +01:00
|
|
|
d->m_vars.value(scAutoDependOn).split(QInstaller::commaRegExp(), QString::SkipEmptyParts);
|
2011-09-16 12:20:27 +02:00
|
|
|
autoDependencyStringList.removeAll(QLatin1String("script"));
|
|
|
|
return autoDependencyStringList;
|
2011-08-23 16:12:50 +02:00
|
|
|
}
|
|
|
|
|
2011-02-21 16:30:31 +01:00
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod void component::setInstalled()
|
2013-02-28 16:32:23 +01:00
|
|
|
|
2011-04-12 15:32:46 +02:00
|
|
|
Set's the components state to installed.
|
|
|
|
*/
|
|
|
|
void Component::setInstalled()
|
|
|
|
{
|
2011-06-06 17:23:48 +02:00
|
|
|
setValue(scCurrentState, scInstalled);
|
2011-04-12 15:32:46 +02:00
|
|
|
}
|
|
|
|
|
2011-07-22 14:35:19 +02:00
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod boolean component::isAutoDependOn(QSet<string> componentsToInstall)
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Determines if the component comes as an auto dependency. Returns \c true if the component needs
|
|
|
|
to be installed.
|
2011-07-22 14:35:19 +02:00
|
|
|
*/
|
2011-08-11 16:02:47 +02:00
|
|
|
bool Component::isAutoDependOn(const QSet<QString> &componentsToInstall) const
|
2011-07-22 14:35:19 +02:00
|
|
|
{
|
2011-08-23 16:12:50 +02:00
|
|
|
// If there is no auto depend on value or the value is empty, we have nothing todo. The component does
|
|
|
|
// not need to be installed as an auto dependency.
|
|
|
|
QStringList autoDependOnList = autoDependencies();
|
|
|
|
if (autoDependOnList.isEmpty())
|
|
|
|
return false;
|
|
|
|
|
2011-08-11 16:02:47 +02:00
|
|
|
// The script can override this method and determines if the component needs to be installed.
|
2011-08-23 16:12:50 +02:00
|
|
|
if (autoDependOnList.first().compare(QLatin1String("script"), Qt::CaseInsensitive) == 0) {
|
2014-06-02 15:14:12 +02:00
|
|
|
QJSValue valueFromScript;
|
2011-08-22 15:07:08 +02:00
|
|
|
try {
|
2013-11-06 12:45:23 +01:00
|
|
|
valueFromScript = d->scriptEngine()->callScriptMethod(d->m_scriptContext,
|
2013-05-08 13:26:41 +02:00
|
|
|
QLatin1String("isAutoDependOn"));
|
2011-08-22 15:07:08 +02:00
|
|
|
} catch (const Error &error) {
|
|
|
|
MessageBoxHandler::critical(MessageBoxHandler::currentBestSuitParent(),
|
2013-06-17 14:01:21 +02:00
|
|
|
QLatin1String("isAutoDependOnError"), tr("Cannot resolve isAutoDependOn in %1"
|
2011-08-22 15:07:08 +02:00
|
|
|
).arg(name()), error.message());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2014-06-02 15:14:12 +02:00
|
|
|
if (!valueFromScript.isError())
|
2011-07-22 14:35:19 +02:00
|
|
|
return valueFromScript.toBool();
|
2014-06-02 15:14:12 +02:00
|
|
|
qDebug() << "Value from script is not valid." << (valueFromScript.toString().isEmpty()
|
|
|
|
? QString::fromLatin1("Unknown error.") : valueFromScript.toString());
|
2011-07-22 14:35:19 +02:00
|
|
|
return false;
|
|
|
|
}
|
2011-08-11 16:02:47 +02:00
|
|
|
|
|
|
|
QSet<QString> components = componentsToInstall;
|
2011-08-18 12:46:27 +02:00
|
|
|
const QStringList installedPackages = d->m_core->localInstalledPackages().keys();
|
|
|
|
foreach (const QString &name, installedPackages)
|
|
|
|
components.insert(name);
|
2011-08-11 16:02:47 +02:00
|
|
|
|
|
|
|
foreach (const QString &component, components) {
|
2011-08-11 16:49:08 +02:00
|
|
|
autoDependOnList.removeAll(component);
|
|
|
|
if (autoDependOnList.isEmpty()) {
|
|
|
|
// If all components in the isAutoDependOn field are already installed or selected for
|
|
|
|
// installation, this component needs to be installed as well.
|
|
|
|
return true;
|
2011-07-22 14:35:19 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2011-06-01 18:18:58 +02:00
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod boolean component::isDefault()
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Indicates if the component is a default one.
|
|
|
|
|
|
|
|
\note Always returns \c false for virtual components.
|
|
|
|
|
|
|
|
\sa default
|
2011-06-01 18:18:58 +02:00
|
|
|
*/
|
|
|
|
bool Component::isDefault() const
|
|
|
|
{
|
2013-02-19 20:18:01 +01:00
|
|
|
if (isVirtual())
|
|
|
|
return false;
|
|
|
|
|
2011-06-01 18:18:58 +02:00
|
|
|
// the script can override this method
|
2013-02-19 20:18:01 +01:00
|
|
|
if (d->m_vars.value(scDefault).compare(QLatin1String("script"), Qt::CaseInsensitive) == 0) {
|
2014-06-02 15:14:12 +02:00
|
|
|
QJSValue valueFromScript;
|
2011-08-22 15:07:08 +02:00
|
|
|
try {
|
2013-11-06 12:45:23 +01:00
|
|
|
valueFromScript = d->scriptEngine()->callScriptMethod(d->m_scriptContext,
|
2013-05-08 13:26:41 +02:00
|
|
|
QLatin1String("isDefault"));
|
2011-08-22 15:07:08 +02:00
|
|
|
} catch (const Error &error) {
|
|
|
|
MessageBoxHandler::critical(MessageBoxHandler::currentBestSuitParent(),
|
2013-06-17 14:01:21 +02:00
|
|
|
QLatin1String("isDefaultError"), tr("Cannot resolve isDefault in %1").arg(name()),
|
2011-08-22 15:07:08 +02:00
|
|
|
error.message());
|
|
|
|
return false;
|
|
|
|
}
|
2014-06-02 15:14:12 +02:00
|
|
|
if (!valueFromScript.isError())
|
2011-06-01 18:18:58 +02:00
|
|
|
return valueFromScript.toBool();
|
2014-06-02 15:14:12 +02:00
|
|
|
qDebug() << "Value from script is not valid." << (valueFromScript.toString().isEmpty()
|
|
|
|
? QString::fromLatin1("Unknown error.") : valueFromScript.toString());
|
2011-06-01 18:18:58 +02:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2013-02-19 20:18:01 +01:00
|
|
|
return d->m_vars.value(scDefault).compare(scTrue, Qt::CaseInsensitive) == 0;
|
2011-06-01 18:18:58 +02:00
|
|
|
}
|
|
|
|
|
2011-04-12 15:32:46 +02:00
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod boolean component::isInstalled()
|
2013-02-28 16:32:23 +01:00
|
|
|
|
2011-04-12 15:32:46 +02:00
|
|
|
Determines if the component is installed.
|
2011-03-09 12:45:22 +01:00
|
|
|
*/
|
2011-02-21 16:30:31 +01:00
|
|
|
bool Component::isInstalled() const
|
|
|
|
{
|
2013-02-19 20:18:01 +01:00
|
|
|
return scInstalled == d->m_vars.value(scCurrentState);
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod boolean component::installationRequested()
|
2013-02-28 16:32:23 +01:00
|
|
|
|
2011-03-09 12:45:22 +01:00
|
|
|
Determines if the user wants to install the component
|
|
|
|
*/
|
2011-02-21 16:30:31 +01:00
|
|
|
bool Component::installationRequested() const
|
|
|
|
{
|
2011-04-12 12:04:55 +02:00
|
|
|
return !isInstalled() && isSelected();
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod void component::setUpdateAvailable(boolean isUpdateAvailable)
|
2013-02-28 16:32:23 +01:00
|
|
|
|
2011-07-26 16:33:55 +02:00
|
|
|
Sets a flag that the core found an update
|
|
|
|
*/
|
|
|
|
void Component::setUpdateAvailable(bool isUpdateAvailable)
|
|
|
|
{
|
|
|
|
d->m_updateIsAvailable = isUpdateAvailable;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod boolean component::updateRequested()
|
2013-02-28 16:32:23 +01:00
|
|
|
|
2011-07-26 16:33:55 +02:00
|
|
|
Determines if the user wants to install the update for this component
|
|
|
|
*/
|
|
|
|
bool Component::updateRequested()
|
|
|
|
{
|
|
|
|
return d->m_updateIsAvailable && isSelected();
|
|
|
|
}
|
|
|
|
|
2011-10-31 13:39:21 +01:00
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod boolean component::componentChangeRequested()
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Returns \c true if that component will be changed (update/installation/uninstallation).
|
2011-10-31 13:39:21 +01:00
|
|
|
*/
|
|
|
|
bool Component::componentChangeRequested()
|
|
|
|
{
|
|
|
|
return updateRequested() || installationRequested() || uninstallationRequested();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-07-26 16:33:55 +02:00
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod void component::setUninstalled()
|
2013-02-28 16:32:23 +01:00
|
|
|
|
2011-07-26 16:33:55 +02:00
|
|
|
Sets the component state to uninstalled.
|
2011-03-09 12:45:22 +01:00
|
|
|
*/
|
2011-04-12 15:32:46 +02:00
|
|
|
void Component::setUninstalled()
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2011-06-06 17:23:48 +02:00
|
|
|
setValue(scCurrentState, scUninstalled);
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod boolean component::isUninstalled()
|
2013-02-28 16:32:23 +01:00
|
|
|
|
2011-04-12 15:32:46 +02:00
|
|
|
Determines if the component is uninstalled.
|
2011-03-09 12:45:22 +01:00
|
|
|
*/
|
2011-04-12 15:32:46 +02:00
|
|
|
bool Component::isUninstalled() const
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2013-02-19 20:18:01 +01:00
|
|
|
return scUninstalled == d->m_vars.value(scCurrentState);
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod boolean component::uninstallationRequested()
|
2013-02-28 16:32:23 +01:00
|
|
|
|
2011-04-12 15:32:46 +02:00
|
|
|
Determines if the user wants to uninstall the component.
|
2011-03-09 12:45:22 +01:00
|
|
|
*/
|
2011-04-12 15:32:46 +02:00
|
|
|
bool Component::uninstallationRequested() const
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2011-08-26 10:02:13 +02:00
|
|
|
if (packageManagerCore()->isUpdater())
|
|
|
|
return false;
|
2011-04-12 15:32:46 +02:00
|
|
|
return isInstalled() && !isSelected();
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2014-10-07 15:05:08 +02:00
|
|
|
\qmlmethod boolean component::isFromOnlineRepository()
|
2013-02-28 16:32:23 +01:00
|
|
|
|
|
|
|
Determines whether this component has been loaded from an online repository.
|
2011-03-09 12:45:22 +01:00
|
|
|
|
2013-02-28 16:32:23 +01:00
|
|
|
\sa addDownloadableArchive, fromOnlineRepository
|
2011-03-09 12:45:22 +01:00
|
|
|
*/
|
2011-02-21 16:30:31 +01:00
|
|
|
bool Component::isFromOnlineRepository() const
|
|
|
|
{
|
|
|
|
return !repositoryUrl().isEmpty();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2011-03-09 12:45:22 +01:00
|
|
|
Contains the repository Url this component is downloaded from.
|
|
|
|
When this component is not downloaded from an online repository, returns an empty #QUrl.
|
|
|
|
*/
|
2011-02-21 16:30:31 +01:00
|
|
|
QUrl Component::repositoryUrl() const
|
|
|
|
{
|
2011-04-13 11:06:16 +02:00
|
|
|
return d->m_repositoryUrl;
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2011-03-09 12:45:22 +01:00
|
|
|
Sets this components #repositoryUrl.
|
2011-02-21 16:30:31 +01:00
|
|
|
*/
|
2011-08-11 19:29:53 +02:00
|
|
|
void Component::setRepositoryUrl(const QUrl &url)
|
2011-02-21 16:30:31 +01:00
|
|
|
{
|
2011-04-13 11:06:16 +02:00
|
|
|
d->m_repositoryUrl = url;
|
2011-02-21 16:30:31 +01:00
|
|
|
}
|
2011-03-15 18:17:20 +01:00
|
|
|
|
|
|
|
|
|
|
|
QString Component::localTempPath() const
|
|
|
|
{
|
2011-04-13 11:06:16 +02:00
|
|
|
return d->m_localTempPath;
|
2011-03-15 18:17:20 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void Component::setLocalTempPath(const QString &tempLocalPath)
|
|
|
|
{
|
2011-04-13 11:06:16 +02:00
|
|
|
d->m_localTempPath = tempLocalPath;
|
2011-03-15 18:17:20 +01:00
|
|
|
}
|
2011-04-01 13:55:31 +02:00
|
|
|
|
|
|
|
void Component::updateModelData(const QString &key, const QString &data)
|
|
|
|
{
|
2011-06-06 17:23:48 +02:00
|
|
|
if (key == scVirtual) {
|
|
|
|
if (data.toLower() == scTrue)
|
2011-06-14 16:24:50 +02:00
|
|
|
setData(d->m_core->virtualComponentsFont(), Qt::FontRole);
|
2014-04-11 16:27:17 +02:00
|
|
|
if (Component *const parent = parentComponent()) {
|
|
|
|
parent->removeComponent(this);
|
|
|
|
parent->appendComponent(this);
|
|
|
|
}
|
|
|
|
emit virtualStateChanged();
|
2011-04-01 13:55:31 +02:00
|
|
|
}
|
|
|
|
|
2011-10-13 13:28:59 +02:00
|
|
|
if (key == scRemoteDisplayVersion)
|
|
|
|
setData(data, RemoteDisplayVersion);
|
2011-04-01 13:55:31 +02:00
|
|
|
|
2011-06-06 17:23:48 +02:00
|
|
|
if (key == scDisplayName)
|
2011-04-01 13:55:31 +02:00
|
|
|
setData(data, Qt::DisplayRole);
|
|
|
|
|
2011-10-13 13:28:59 +02:00
|
|
|
if (key == scDisplayVersion)
|
|
|
|
setData(data, LocalDisplayVersion);
|
2011-04-01 13:55:31 +02:00
|
|
|
|
2013-08-16 13:53:03 +02:00
|
|
|
if (key == scReleaseDate)
|
|
|
|
setData(data, ReleaseDate);
|
|
|
|
|
2012-03-21 14:28:40 +01:00
|
|
|
if (key == scUncompressedSize) {
|
2013-02-19 20:18:01 +01:00
|
|
|
quint64 size = d->m_vars.value(scUncompressedSizeSum).toLongLong();
|
2012-03-21 14:28:40 +01:00
|
|
|
setData(humanReadableSize(size), UncompressedSize);
|
|
|
|
}
|
2011-04-01 13:55:31 +02:00
|
|
|
|
2013-02-19 20:18:01 +01:00
|
|
|
const QString &updateInfo = d->m_vars.value(scUpdateText);
|
2011-09-09 16:35:06 +02:00
|
|
|
if (!d->m_core->isUpdater() || updateInfo.isEmpty()) {
|
2014-06-19 16:20:41 +02:00
|
|
|
const QString tooltipText
|
|
|
|
= QString::fromLatin1("<html><body>%1</body></html>").arg(d->m_vars.value(scDescription));
|
|
|
|
setData(tooltipText, Qt::ToolTipRole);
|
2011-06-22 12:53:18 +02:00
|
|
|
} else {
|
2014-06-19 16:20:41 +02:00
|
|
|
const QString tooltipText
|
|
|
|
= d->m_vars.value(scDescription) + QLatin1String("<br><br>")
|
|
|
|
+ tr("Update Info: ") + updateInfo;
|
|
|
|
|
|
|
|
setData(tooltipText, Qt::ToolTipRole);
|
2011-06-22 12:53:18 +02:00
|
|
|
}
|
2011-04-01 13:55:31 +02:00
|
|
|
}
|
2011-11-17 15:52:34 +01:00
|
|
|
|
|
|
|
|
|
|
|
QDebug QInstaller::operator<<(QDebug dbg, Component *component)
|
|
|
|
{
|
|
|
|
dbg << "component: " << component->name() << "\n";
|
|
|
|
dbg << "\tisSelected: \t" << component->isSelected() << "\n";
|
|
|
|
dbg << "\tisInstalled: \t" << component->isInstalled() << "\n";
|
|
|
|
dbg << "\tisUninstalled: \t" << component->isUninstalled() << "\n";
|
|
|
|
dbg << "\tupdateRequested: \t" << component->updateRequested() << "\n";
|
|
|
|
dbg << "\tinstallationRequested: \t" << component->installationRequested() << "\n";
|
|
|
|
dbg << "\tuninstallationRequested: \t" << component->uninstallationRequested() << "\n";
|
|
|
|
return dbg;
|
|
|
|
}
|