Merge remote-tracking branch 'origin/2.0'

Conflicts:
	src/libs/installer/packagemanagercore.cpp

Change-Id: Ie3d94fe3a633e189c260bf20682c00a2bb901bc8
This commit is contained in:
Kai Koehne 2015-06-04 12:42:24 +02:00
commit 1be5082af8
31 changed files with 1640 additions and 571 deletions

View File

@ -5,7 +5,12 @@
- Fix --checkupdates mode. - Fix --checkupdates mode.
- Prevent disabled component to be selected using the Select All button. (QTIFW-635) - Prevent disabled component to be selected using the Select All button. (QTIFW-635)
- Windows: Fix crashes in elevated installation. (QTIFW-6656, QTIFW-659) - Windows: Fix crashes in elevated installation. (QTIFW-6656, QTIFW-659)
- OS X: Fix problems with writing settings in elevated installation (QTIFW-709)
- Fix crash on exit for Windows XP, Vista. (QTIFW-652) - Fix crash on exit for Windows XP, Vista. (QTIFW-652)
- Re-add handling of zero compression level files supported by 7z.
- Improve Proxy Credentials dialog.
- Make component checker warning optional (set QT_LOGGING_RULES=ifw.componentChecker=true to enable).
- Make code ready to be compiled with Qt 5.5.
- Documentation updates. - Documentation updates.
2.0.0 2.0.0

11
INSTALL
View File

@ -26,13 +26,13 @@ See the Qt documentation for the prerequisites and steps to build Qt from source
### Windows ### Windows
Adjust the qmake.conf to have a real stand alone working installer: For Qt 5.4, you need to adjust the respective qmake.conf to have a real stand alone
Replace -MD, -MDd with -MT, -MTD in the CFLAGS lines working installer. Replace -MD, -MDd with -MT, -MTD in the CFLAGS lines.
'git diff' should show you something like: 'git diff' should show you something like:
--- a/mkspecs/win32-msvc20XX/qmake.conf --- a/mkspecs/win32-msvc2013/qmake.conf
+++ b/mkspecs/win32-msvc20XX/qmake.conf +++ b/mkspecs/win32-msvc2013/qmake.conf
QMAKE_CFLAGS = -nologo -Zm200 -Zc:wchar_t -FS QMAKE_CFLAGS = -nologo -Zm200 -Zc:wchar_t -FS
QMAKE_CFLAGS_WARN_ON = -W3 QMAKE_CFLAGS_WARN_ON = -W3
QMAKE_CFLAGS_WARN_OFF = -W0 QMAKE_CFLAGS_WARN_OFF = -W0
@ -46,6 +46,9 @@ Replace -MD, -MDd with -MT, -MTD in the CFLAGS lines
QMAKE_CFLAGS_LTCG = -GL QMAKE_CFLAGS_LTCG = -GL
QMAKE_CFLAGS_MP = -MP QMAKE_CFLAGS_MP = -MP
From Qt 5.5 onwards, you can achieve the same by passing -static-runtime to
configure.
Recommended configuration options for Microsoft Windows: Recommended configuration options for Microsoft Windows:
configure -prefix %CD%\qtbase -release -static -target xp -accessibility -no-opengl -no-icu -no-sql-sqlite -no-qml-debug -nomake examples -nomake tests -skip qtactiveqt -skip qtenginio -skip qtlocation -skip qtmultimedia -skip qtserialport -skip qtquick1 -skip qtquickcontrols -skip qtscript -skip qtsensors -skip qtwebkit -skip qtwebsockets -skip qtxmlpatterns configure -prefix %CD%\qtbase -release -static -target xp -accessibility -no-opengl -no-icu -no-sql-sqlite -no-qml-debug -nomake examples -nomake tests -skip qtactiveqt -skip qtenginio -skip qtlocation -skip qtmultimedia -skip qtserialport -skip qtquick1 -skip qtquickcontrols -skip qtscript -skip qtsensors -skip qtwebkit -skip qtwebsockets -skip qtxmlpatterns

View File

@ -1,9 +1,9 @@
GNU LESSER GENERAL PUBLIC LICENSE GNU LESSER GENERAL PUBLIC LICENSE
The Qt Toolkit is Copyright (C) 2015 The Qt Company Ltd. The Qt Installer Famework is Copyright (C) 2015 The Qt Company Ltd.
Contact: http://www.qt.io/licensing/ Contact: http://www.qt.io/licensing/
You may use, distribute and copy the Qt GUI Toolkit under the terms of You may use, distribute and copy the Qt Installer Famework under the terms of
GNU Lesser General Public License version 3, which is displayed below. GNU Lesser General Public License version 3, which is displayed below.
------------------------------------------------------------------------- -------------------------------------------------------------------------

View File

@ -1,9 +1,9 @@
GNU LESSER GENERAL PUBLIC LICENSE GNU LESSER GENERAL PUBLIC LICENSE
The Qt Toolkit is Copyright (C) 2015 The Qt Company Ltd. The Qt Installer Famework is Copyright (C) 2015 The Qt Company Ltd.
Contact: http://www.qt.io/licensing/ Contact: http://www.qt.io/licensing/
You may use, distribute and copy the Qt GUI Toolkit under the terms of You may use, distribute and copy the Qt Installer Famework under the terms of
GNU Lesser General Public License version 3, which is displayed below. GNU Lesser General Public License version 3, which is displayed below.
------------------------------------------------------------------------- -------------------------------------------------------------------------

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -71,11 +71,12 @@
\section3 Configuring Qt for Windows \section3 Configuring Qt for Windows
Before running configure you should tweak Qt to statically link in the C Usually, you want to tweak Qt to statically link in the C
runtime library. This can be done by changing the default mkspec of runtime library. This can be done by changing the default mkspec of
your compiler. your compiler (Qt 5.4) or by passing \c{-static-runtime} to configure (Qt 5.5
and newer).
If you are using e.g. the Microsoft Visual Studio 2013 compiler, you edit For Qt 5.4, you need to edit
\c{mkspecs\win32-msvc2013\qmake.conf} and replace in the CFLAGS sections \c{mkspecs\win32-msvc2013\qmake.conf} and replace in the CFLAGS sections
'-MD' with '-MT': '-MD' with '-MT':

View File

@ -716,6 +716,8 @@
\li \l archivegen \li \l archivegen
\li \l devtool
\endlist \endlist
\section1 installerbase \section1 installerbase
@ -737,7 +739,7 @@
###TODO insert link here. ###TODO insert link here.
For information about how to implement data integration into the For information about how to implement data integration into the
installer binary, see \c QInstaller::BinaryContent ###TODO insert link here. installer binary, see QInstaller::BinaryContent.
\note If you change this configuration, you must recompile the \note If you change this configuration, you must recompile the
\c installerbase tool. \c installerbase tool.
@ -936,6 +938,53 @@
Where \e <name.7z> is the path and file name of the archive to create and Where \e <name.7z> is the path and file name of the archive to create and
\e <data> contains the paths and names of the files or directories to \e <data> contains the paths and names of the files or directories to
package into the archive, separated by spaces. package into the archive, separated by spaces.
\section1 devtool
You can use \c devtool to update an existing installer or maintenance tool
with a new installer base, to dump binary content from an installer or
maintenance tool to a target, and to execute operations. For a summary of
available operations, see \l {Operations}.
\c devtool expects the following parameters in the following order:
\code
devtool [options] binary
\endcode
Where \e binary is the path and name of an existing installer or maintenance
tool.
\section2 Summary of devtool Parameters
\table
\header
\li Parameter
\li Use
\row
\li -?, -h, --help
\li Display help.
\row
\li -v, --version
\li Display version information.
\row
\li --verbose
\li Display additional information.
\row
\li --update <file>
\li Update an existing installer or maintenance tool with a new
installer base.
\row
\li --dump <folder>
\li Dump the binary content that belongs to an installer or
maintenance tool into the target.
\row
\li --operation <mode,name,args,...>
\li Execute an operation with a list of arguments.
\c mode can be \c DO or \c UNDO, depending on whether the step
contains instructions for the installer or uninstaller.
\endtable
*/ */
/*! /*!

View File

@ -34,7 +34,11 @@
\title Controller Scripting \title Controller Scripting
For each installer, you can specify a control script that interacts with certain parts of For each installer, you can specify a control script that interacts with certain parts of
the installer's UI or functionality. The script format has to be compatible with QJSEngine. the installer's UI or functionality. The control script can add and remove pages to the
wizard, change existing pages, do additional checks, and interact with the UI by
simulating user clicks. This allows for example unattended installations.
The script format has to be compatible with QJSEngine.
This section describes the functions that are called to implement such a control script. This section describes the functions that are called to implement such a control script.
It also gives an overview of installer pages and the widgets that are available on each It also gives an overview of installer pages and the widgets that are available on each
@ -63,7 +67,7 @@
{ {
var widget = gui.currentPageWidget(); // get the current wizard page var widget = gui.currentPageWidget(); // get the current wizard page
if (widget != null) { if (widget != null) {
widget.setColoredTitle("New title."); // set the page title widget.title = "New title."; // set the page title
widget.MessageLabel.setText("New Message."); // set the welcome text widget.MessageLabel.setText("New Message."); // set the welcome text
} }
} }

View File

@ -114,10 +114,8 @@
In addition, a special argument, UNDOEXECUTE, separates the DO step of the operation In addition, a special argument, UNDOEXECUTE, separates the DO step of the operation
from the UNDO step. from the UNDO step.
example: Example:
\code \c{component.addOperation("Execute", "touch", "test.txt", "UNDOEXECUTE", "rm", "test.txt")}
component.addOperation("Execute", "touch", "test.txt", "UNDOEXECUTE", "rm", "test.txt")
\endcode
\row \row
\li CreateShortcut \li CreateShortcut
\li "CreateShortcut" \c filename \c linkname [\c arguments] \li "CreateShortcut" \c filename \c linkname [\c arguments]
@ -127,7 +125,7 @@
\c arguments. On Unix, this creates a symbolic link. \c arguments. On Unix, this creates a symbolic link.
\row \row
\li CreateDesktopEntry \li CreateDesktopEntry
\li "CreateDesktopEntry" \c filename \c "key=value[\nkey2=value2[\nkey3=value3]]]" \li "CreateDesktopEntry" \c {filename "key=value[ key2=value2[ key3=value3]]]"}
\li Creates a .desktop initialization file, as specified by \li Creates a .desktop initialization file, as specified by
freedesktop.org. freedesktop.org.
@ -173,7 +171,7 @@
registry) or by \c application and \c company name. Set \c scope registry) or by \c application and \c company name. Set \c scope
to "SystemScope" to create an entry in the system scope. to "SystemScope" to create an entry in the system scope.
\note: The operation is using QSettings to store the key value pair. QSettings \note The operation is using QSettings to store the key value pair. QSettings
always treats backslash as a special character and provides no API for reading always treats backslash as a special character and provides no API for reading
or writing such entries. Do not use slashes ('/' and '\') in section or key names; or writing such entries. Do not use slashes ('/' and '\') in section or key names;
the backslash character is used to separate sub keys. On windows, '\' are converted the backslash character is used to separate sub keys. On windows, '\' are converted

View File

@ -59,4 +59,6 @@
A custom button. A custom button.
\value buttons.CustomButton3 \value buttons.CustomButton3
A custom button. A custom button.
\sa {Controller Scripting}
*/ */

View File

@ -156,16 +156,11 @@
Emitted when the component has been loaded. Emitted when the component has been loaded.
*/ */
/*!
\qmlsignal component::selectedChanged(boolean isSelected)
Emitted when the component selection has changed to \a isSelected.
*/
/*! /*!
\qmlsignal component::valueChanged(string key, string value) \qmlsignal component::valueChanged(string key, string value)
Emitted when the variable with name \a key has changed to \a value. Emitted when the value of the variable with the name \a key changes to
\a value.
\sa setValue \sa setValue
*/ */
@ -180,8 +175,9 @@
\qmlmethod string component::value(string key, string value = "") \qmlmethod string component::value(string key, string value = "")
Returns the value of variable name \a key. If \a key is not known yet, \a defaultValue is returned. 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
return \c false. \note If a component is virtual and you ask for the component value with the
key "Default", it will always return \c false.
*/ */
/*! /*!
@ -199,7 +195,8 @@
/*! /*!
\qmlmethod QWidget component::userInterface(string name) \qmlmethod QWidget component::userInterface(string name)
Returns the QWidget created for \a name or 0 if the widget already has been deleted or cannot be found. Returns the QWidget created for \a name or \c 0 if the widget has been
deleted or cannot be found.
*/ */
/*! /*!
@ -207,11 +204,12 @@
Creates all operations needed to install this component's \a path. \a path is a full qualified Creates all operations needed to install this component's \a path. \a path is a full qualified
filename including the component's name. This method gets called from filename including the component's name. This method gets called from
component::createOperationsForArchive. You can override it by providing a method with createOperationsForArchive. You can override it by providing a method with
the same name in the component script. the same name in the component script.
\note RSA signature files are omitted by this method. \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. \note If you call this method from a script, it will not call the script's
method with the same name.
The default implementation is recursively creating Copy and Mkdir operations for all files The default implementation is recursively creating Copy and Mkdir operations for all files
and folders within \a path. and folders within \a path.
@ -221,10 +219,11 @@
\qmlmethod void component::createOperationsForArchive(string archive) \qmlmethod void component::createOperationsForArchive(string archive)
Creates all operations needed to install this component's \a archive. This method gets called Creates all operations needed to install this component's \a archive. This method gets called
from component::createOperations. You can override this method by providing a method with the from createOperations. You can override this method by providing a method with the
same name in the component script. 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. \note If you call this method from a script, it will not call the script's
method with the same name.
The default implementation calls createOperationsForPath for everything contained in the archive. 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 If \a archive is a compressed archive known to the installer system, an Extract operation is
@ -251,11 +250,20 @@
\qmlmethod void component::createOperations() \qmlmethod void component::createOperations()
Creates all operations needed to install this component. 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. 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. \code
Component.prototype.createOperations = function()
{
// call default implementation
component.createOperations();
// ... add custom operations
}
\endcode
The default implementation calls createOperationsForArchive for all archives in this component. The default implementation calls createOperationsForArchive for all archives in this component.
\sa component::addOperation()
*/ */
/*! /*!
@ -288,8 +296,8 @@
/*! /*!
\qmlmethod void component::addStopProcessForUpdateRequest(string process) \qmlmethod void component::addStopProcessForUpdateRequest(string process)
Adds a request for quitting the process \a process before installing/updating/uninstalling the Adds a request for quitting the process \a process before installing,
component. updating, or uninstalling the component.
*/ */
/*! /*!
@ -301,13 +309,9 @@
/*! /*!
\qmlmethod void component::setStopProcessForUpdateRequest(string process, boolean requested) \qmlmethod void component::setStopProcessForUpdateRequest(string process, boolean requested)
Convenience: Add/remove request depending on \a requested (add if \c true, remove if \c false). A convenience method for adding or removing the request for stopping
*/ \a process depending on whether \a requested is \c true (add) or \c false
(remove).
/*!
\qmlmethod boolean component::addOperation(string operation, string parameter1 = "", string parameter2 = "", ..., string parameter10 = "")
Convenience method for calling addOperation(string, stringlist) with up to 10 arguments.
*/ */
/*! /*!
@ -316,6 +320,14 @@
Creates and adds an installation operation for \a operation. Add any number of parameters. 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, The contents of the parameters get variables like "@TargetDir@" replaced with their values,
if contained. if contained.
The method is typically called from within \l component::createOperations().
*/
/*!
\qmlmethod boolean component::addOperation(string operation, string parameter1 = "", string parameter2 = "", ..., string parameter10 = "")
Convenience method for calling addOperation(string, stringlist) with up to 10 arguments.
*/ */
/*! /*!
@ -355,7 +367,7 @@
/*! /*!
\qmlmethod boolean component::isAutoDependOn(QSet<string> componentsToInstall) \qmlmethod boolean component::isAutoDependOn(QSet<string> componentsToInstall)
Determines if the component comes as an auto dependency. Returns \c true if the component needs Determines whether the component comes as an auto dependency. Returns \c true if the component needs
to be installed. to be installed.
*/ */
@ -372,31 +384,32 @@
/*! /*!
\qmlmethod boolean component::isInstalled() \qmlmethod boolean component::isInstalled()
Determines if the component is installed. Determines whether the component is installed.
*/ */
/*! /*!
\qmlmethod boolean component::installationRequested() \qmlmethod boolean component::installationRequested()
Determines if the user wants to install the component Determines whether the user wants to install the component.
*/ */
/*! /*!
\qmlmethod void component::setUpdateAvailable(boolean isUpdateAvailable) \qmlmethod void component::setUpdateAvailable(boolean isUpdateAvailable)
Sets a flag that the core found an update Sets a flag that the core found an update.
*/ */
/*! /*!
\qmlmethod boolean component::updateRequested() \qmlmethod boolean component::updateRequested()
Determines if the user wants to install the update for this component Determines whether the user wants to install the update for this component.
*/ */
/*! /*!
\qmlmethod boolean component::componentChangeRequested() \qmlmethod boolean component::componentChangeRequested()
Returns \c true if that component will be changed (update/installation/uninstallation). Returns \c true if this component will be changed (update, installation, or
uninstallation).
*/ */
/*! /*!
@ -408,13 +421,13 @@
/*! /*!
\qmlmethod boolean component::isUninstalled() \qmlmethod boolean component::isUninstalled()
Determines if the component is uninstalled. Determines whether the component is uninstalled.
*/ */
/*! /*!
\qmlmethod boolean component::uninstallationRequested() \qmlmethod boolean component::uninstallationRequested()
Determines if the user wants to uninstall the component. Determines whether the user wants to uninstall the component.
*/ */
/*! /*!

View File

@ -0,0 +1,737 @@
/****************************************************************************
**
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the Qt Installer Framework.
**
** $QT_BEGIN_LICENSE:FDL$
** 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 The Qt Company. For licensing terms
** and conditions see http://qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
** will be met: http://www.gnu.org/copyleft/fdl.html.
** $QT_END_LICENSE$
**
****************************************************************************/
/*!
\qmltype installer
\inqmlmodule scripting
\brief Provides access to core functionality of the Qt Installer Framework.
*/
/*!
\qmlmethod array installer::components()
Returns an array of all available components.
\sa component
*/
/*!
\qmlsignal installer::aboutCalculateComponentsToInstall()
Emitted before the ordered list of components to install is calculated.
*/
/*!
\qmlsignal installer::finishedCalculateComponentsToInstall()
Emitted after the ordered list of components to install was calculated.
*/
/*!
\qmlsignal installer::aboutCalculateComponentsToUninstall()
Emitted before the ordered list of components to uninstall is calculated.
*/
/*!
\qmlsignal installer::finishedCalculateComponentsToUninstall()
Emitted after the ordered list of components to uninstall was calculated.
*/
/*!
\qmlsignal installer::componentAdded(Component component)
Emitted when a new root component is added.
\sa rootComponentsAdded, updaterComponentsAdded
*/
/*!
\qmlsignal installer::rootComponentsAdded(list<Component> components)
Emitted when a new list of root components is added.
\sa componentAdded, updaterComponentsAdded
*/
/*!
\qmlsignal installer::updaterComponentsAdded(list<Component> components)
Emitted when a new list of updater components is added.
\sa componentAdded, rootComponentsAdded
*/
/*!
\qmlsignal installer::valueChanged(string key, string value)
Emitted when a value changes.
\sa setValue
*/
/*!
\qmlsignal installer::statusChanged(Status status)
Emitted when the installer status changes.
*/
/*!
\qmlsignal installer::currentPageChanged(int page)
Emitted when the current page changes.
*/
/*!
\qmlsignal installer::finishButtonClicked()
Emitted when the user clicks the \uicontrol Finish button of the installer.
*/
/*!
\qmlsignal installer::metaJobProgress(int progress)
Triggered with progress updates of the communication with a remote
repository. Progress ranges from 0 to 100.
*/
/*!
\qmlsignal installer::metaJobInfoMessage(string message)
Triggered with informative updates of the communication with a remote repository.
*/
/*!
\qmlsignal installer::startAllComponentsReset()
Triggered when the list of components starts to get updated.
\sa finishAllComponentsReset
*/
/*!
\qmlsignal installer::finishAllComponentsReset(list<Component> rootComponents)
Triggered when the list of new root components has been updated.
\sa startAllComponentsReset
*/
/*!
\qmlsignal installer::startUpdaterComponentsReset()
Triggered when components start to get updated during a remote update.
*/
/*!
\qmlsignal installer::finishUpdaterComponentsReset(list<Component> componentsWithUpdates)
Triggered when the list of available remote updates has been updated.
*/
/*!
\qmlsignal installer::installationStarted()
Triggered when installation has started.
\sa installationFinished installationInterrupted
*/
/*!
\qmlsignal installer::installationInterrupted()
Triggered when installation has been interrupted (cancelled).
\sa interrupt installationStarted installationFinished
*/
/*!
\qmlsignal installer::installationFinished()
Triggered when installation has finished.
\sa installationStarted installationInterrupted
*/
/*!
\qmlsignal installer::updateFinished()
Triggered when an update has finished.
*/
/*!
\qmlsignal installer::uninstallationStarted()
Triggered when uninstallation has started.
\sa uninstallationFinished
*/
/*!
\qmlsignal installer::uninstallationFinished()
Triggered when uninstallation has finished.
\sa uninstallationStarted
*/
/*!
\qmlsignal installer::titleMessageChanged(string title)
Emitted when the text of the installer status (on the PerformInstallation page) changes to
\a title.
*/
/*!
\qmlsignal installer::wizardPageInsertionRequested(Widget widget, WizardPage page)
Emitted when a custom \a widget is about to be inserted into \a page by addWizardPage.
*/
/*!
\qmlsignal installer::wizardPageRemovalRequested(Widget widget)
Emitted when a \a widget is removed by removeWizardPage.
*/
/*!
\qmlsignal installer::wizardWidgetInsertionRequested(Widget widget, WizardPage page)
Emitted when a \a widget is inserted into \a page by addWizardPageItem.
*/
/*!
\qmlsignal installer::wizardWidgetRemovalRequested(Widget widget)
Emitted when a \a widget is removed by removeWizardPageItem.
*/
/*!
\qmlsignal installer::wizardPageVisibilityChangeRequested(bool visible, int page)
Emitted when the visibility of the page with id \a page changes to \a visible.
\sa setDefaultPageVisible
*/
/*!
\qmlsignal installer::setValidatorForCustomPageRequested(Component component, string name,
string callbackName)
Triggered when setValidatorForCustomPage is called.
*/
/*!
\qmlsignal installer::setAutomatedPageSwitchEnabled(bool request)
Triggered when the automatic switching from PerformInstallation to InstallationFinished page
is enabled (\a request = \c true) or disabled (\a request = \c false).
The automatic switching is disabled automatically when for example the user expands or unexpands
the \gui Details section of the PerformInstallation page.
*/
/*!
\qmlsignal installer::coreNetworkSettingsChanged()
Emitted when the network settings are changed.
*/
/*!
\qmlmethod void installer::setCompleteUninstallation(bool complete)
Sets the uninstallation to be \a complete. If \a complete is false, only components deselected
by the user will be uninstalled. This option applies only on uninstallation.
*/
/*!
\qmlmethod void installer::cancelMetaInfoJob()
Cancels the retrieval of meta information from a remote repository.
*/
/*!
\qmlmethod void installer::componentsToInstallNeedsRecalculation()
Ensures that component dependencies are re-calculated.
*/
/*!
\qmlmethod void installer::autoAcceptMessageBoxes()
Automatically accept all user message boxes.
\sa autoRejectMessageBoxes, setMessageBoxAutomaticAnswer
*/
/*!
\qmlmethod void installer::autoRejectMessageBoxes()
Automatically reject all user message boxes.
\sa autoAcceptMessageBoxes, setMessageBoxAutomaticAnswer
*/
/*!
\qmlmethod void installer::setMessageBoxAutomaticAnswer(string identifier, int button)
Automatically close the message box with ID \a identifier as if the user had pressed \a button.
This can be used for unattended (automatic) installations.
\sa QMessageBox, autoAcceptMessageBoxes, autoRejectMessageBoxes
*/
/*!
\qmlmethod float installer::requiredDiskSpace()
Returns the additional estimated amount of disk space in bytes required after installation.
\sa requiredTemporaryDiskSpace
*/
/*!
\qmlmethod float installer::requiredTemporaryDiskSpace()
Returns the estimated required disk space during installation in bytes.
\sa requiredDiskSpace
*/
/*!
\qmlmethod boolean installer::isFileExtensionRegistered(string extension)
Returns whether a file extension is already registered in the Windows registry. Returns \c false
on all other platforms.
*/
/*!
\qmlmethod boolean installer::fileExists(string filePath)
Returns \c true if the \a filePath exists; otherwise returns \c false.
\note If the file is a symlink that points to a non existing
file, \c false is returned.
*/
/*!
\qmlmethod boolean installer::addWizardPage(Component component, string name, int page)
Adds the widget with objectName() \a name registered by \a component as a new page
into the installer's GUI wizard. The widget is added before \a page.
See \l{Controller Scripting} for the possible values of \a page.
Returns \c true if the operation succeeded.
\sa removeWizardPage, setDefaultPageVisible
*/
/*!
\qmlmethod boolean installer::removeWizardPage(Component component, string name)
Removes the widget with objectName() \a name previously added to the installer's wizard
by \a component.
Returns \c true if the operation succeeded.
\sa addWizardPage, setDefaultPageVisible, wizardPageRemovalRequested
*/
/*!
\qmlmethod boolean installer::setDefaultPageVisible(int page, boolean visible)
Sets the visibility of the default page with the ID \a page to \a visible. That is,
removes it from or adds it to the wizard. This works only for pages that were
in the installer when it was started.
Returns \c true.
\sa addWizardPage, removeWizardPage
*/
/*!
\qmlmethod void installer::setValidatorForCustomPage(Component component, string name,
string callbackName)
\sa setValidatorForCustomPageRequested
*/
/*!
\qmlmethod boolean installer::addWizardPageItem(Component component, string name, int page)
Adds the widget with objectName() \a name registered by \a component as a GUI element
into the installer's GUI wizard. The widget is added on \a page.
See \l{Controller Scripting} for the possible values of \a page.
\sa removeWizardPageItem, wizardWidgetInsertionRequested
*/
/*!
\qmlmethod boolean installer::removeWizardPageItem(Component component, string name)
Removes the widget with objectName() \a name previously added to the installer's wizard
by \a component.
\sa addWizardPageItem
*/
/*!
\qmlmethod void installer::addUserRepositories(stringlist repositories)
Registers additional \a repositories.
\sa setTemporaryRepositories
*/
/*!
\qmlmethod void installer::setTemporaryRepositories(stringlist repositories, boolean replace)
Sets additional \a repositories for this instance of the installer or updater.
Will be removed after invoking it again.
\sa addUserRepositories
*/
/*!
\qmlmethod boolean installer::calculateComponentsToInstall()
Calculates an ordered list of components to install based on the current run mode. Also auto
installed dependencies are resolved. The aboutCalculateComponentsToInstall() signal is emitted
before the calculation starts, the finishedCalculateComponentsToInstall() signal once all
calculations are done.
*/
/*!
\qmlmethod boolean installer::calculateComponentsToUninstall()
Calculates a list of components to uninstall based on the current run mode. Auto installed
dependencies are not yet resolved. The aboutCalculateComponentsToUninstall() signal is emitted
before the calculation starts, the finishedCalculateComponentsToUninstall() signal once all
calculations are done. Always returns \c true.
*/
/*!
\qmlmethod boolean installer::gainAdminRights()
Tries to gain admin rights. On success, it returns \c true.
\sa dropAdminRights
*/
/*!
\qmlmethod void installer::dropAdminRights()
Drops admin rights gained by gainAdminRights.
\sa gainAdminRights
*/
/*!
\qmlmethod boolean installer::isProcessRunning(string name)
Returns \c true if a process with \a name is running. On Windows, the comparison
is case-insensitive.
*/
/*!
\qmlmethod boolean installer::killProcess(string absoluteFilePath)
Returns \c true if a process with \a absoluteFilePath could be killed or is
not running.
\note This is implemented in a semi blocking way (to keep the main thread to paint the UI).
*/
/*!
\qmlmethod void installer::setDependsOnLocalInstallerBinary()
Makes sure the installer runs from a local drive. Otherwise the user will get an
appropriate error message.
\note This only works on Windows.
\sa localInstallerBinaryUsed
*/
/*!
\qmlmethod boolean installer::localInstallerBinaryUsed()
Returns \c false if the installer is run on Windows, and the installer has been started from
a remote file system drive. Otherwise returns \c true.
\sa setDependsOnLocalInstallerBinary
*/
/*!
\qmlmethod array installer::execute(string program, stringlist arguments = undefined,
string stdin = "")
Starts the program \a program with the arguments \a arguments in a
new process and waits for it to finish.
\a stdin is sent as standard input to the application.
Returns an empty array if the program could not be executed, otherwise
the output of command as the first item, and the return code as the second.
\note On Unix, the output is just the output to stdout, not to stderr.
\sa executeDetached
*/
/*!
\qmlmethod boolean installer::executeDetached(string program, stringlist arguments = undefined,
string workingDirectory = "")
Starts the program \a program with the arguments \a arguments in a
new process, and detaches from it. Returns \c true on success;
otherwise returns \c false. If the installer exits, the
detached process will continue to live.
\note Arguments that contain spaces are not passed to the
process as separate arguments.
\b{Unix:} The started process will run in its own session and act
like a daemon.
\b{Windows:} Arguments that contain spaces are wrapped in quotes.
The started process will run as a regular standalone process.
The process will be started in the directory \a workingDirectory.
*/
/*!
\qmlmethod string installer::environmentVariable(string name)
Returns the content of the environment variable \a name. An empty string is returned if the
environment variable is not set.
*/
/*!
\qmlmethod boolean installer::performOperation(string name, stringlist arguments)
Instantly performs the operation \a name with \a arguments.
*/
/*!
\qmlmethod boolean installer::versionMatches(string version, string requirement)
Returns \c true when \a version matches the \a requirement.
\a requirement can be a fixed version number or it can be prefixed by the comparators '>', '>=',
'<', '<=' and '='.
*/
/*!
\qmlmethod string installer::findLibrary(string name, stringlist paths = [])
Finds a library named \a name in \a paths.
If \a paths is empty, it gets filled with platform dependent default paths.
The resulting path is returned.
This method can be used by scripts to check external dependencies.
\sa findPath
*/
/*!
\qmlmethod string installer::findPath(string name, stringlist paths = [])
Tries to find a file name \a name in one of \a paths.
The resulting path is returned.
This method can be used by scripts to check external dependencies.
\sa findLibrary
*/
/*!
\qmlmethod void installer::setInstallerBaseBinary(string path)
Sets the \c installerbase binary to use when writing the maintenance tool.
Set the path if an update to the binary is available.
If not set, the executable segment of the running installer or uninstaller
will be used.
*/
/*!
\qmlmethod string installer::value(string key, string defaultValue = "")
Returns the installer value for \a key. If \a key is not known to the system, \a defaultValue is
returned. Additionally, on Windows, \a key can be a registry key.
\sa setValue, containsValue, valueChanged
*/
/*!
\qmlmethod stringlist installer::values(string key, stringlist defaultValue = [])
Returns the installer value for \a key. If \a key is not known to the system, \a defaultValue is
returned. Additionally, on Windows, \a key can be a registry key.
\sa value
*/
/*!
\qmlmethod void installer::setValue(string key, string value)
Sets the installer value for \a key to \a value.
\sa value, containsValue, valueChanged
*/
/*!
\qmlmethod boolean installer::containsValue(string key)
Returns \c true if the installer contains a value for \a key.
\sa value, setValue, valueChanged
*/
/*!
\qmlmethod void installer::setSharedFlag(string key, boolean value)
Sets a shared flag with name \a key to \a value. This is one option
to share information between scripts.
Deprecated since 2.0.0. Use setValue instead.
*/
/*!
\qmlmethod boolean installer::sharedFlag(string key)
Returns shared flag with name \a key. This is one option
to share information between scripts.
Deprecated since 2.0.0. Use \l value or \l values instead.
*/
/*!
\qmlmethod void installer::interrupt()
Cancels an ongoing installation.
\sa installationInterrupted
*/
/*!
\qmlmethod void installer::setCanceled()
Cancels the installation.
*/
/*!
\qmlmethod boolean installer::isInstaller()
Returns \c true if the application, binary, or executable is executed in
installer mode.
\sa isUninstaller, isUpdater, isPackageManager
*/
/*!
\qmlmethod boolean installer::isOfflineOnly()
Returns \c true if this is an offline-only installer.
*/
/*!
\qmlmethod void installer::setUninstaller()
Forces an uninstaller context.
\sa isUninstaller, setUpdater, setPackageManager
*/
/*!
\qmlmethod boolean installer::isUninstaller()
Returns \c true if the the application, binary, or executable is executed in
uninstaller mode.
\sa setUninstaller, isInstaller, isUpdater, isPackageManager
*/
/*!
\qmlmethod void installer::setUpdater()
Forces an updater context.
\sa isUpdater, setUninstaller, setPackageManager
*/
/*!
\qmlmethod boolean installer::isUpdater()
Returns \c true if the the application, binary, or executable is executed in
updater mode.
\sa setUpdater, isInstaller, isUninstaller, isPackageManager
*/
/*!
\qmlmethod void installer::setPackageManager()
Forces a package manager context.
*/
/*!
\qmlmethod boolean installer::isPackageManager()
Returns \c true if the the application, binary, or executable is executed in
package manager mode.
\sa setPackageManager, isInstaller, isUninstaller, isUpdater
*/
/*!
\qmlmethod boolean installer::runInstaller()
Runs the installer. Returns \c true on success, \c false otherwise.
*/
/*!
\qmlmethod boolean installer::runUninstaller()
Runs the uninstaller. Returns \c true on success, \c false otherwise.
*/
/*!
\qmlmethod boolean installer::runPackageUpdater()
Runs the package updater. Returns \c true on success, \c false otherwise.
*/
/*!
\qmlmethod void installer::languageChanged()
Calls languangeChanged on all components.
*/

View File

@ -121,6 +121,10 @@
component::addOperation(). If you need to run an operation that requires component::addOperation(). If you need to run an operation that requires
administrative rights, use component::addElevatedOperation() instead. administrative rights, use component::addElevatedOperation() instead.
Operations need to be added before the actual installation step. Override
\l component::createOperations() to register custom operations for a
component.
Each operation has a unique key used for identification and can take up to Each operation has a unique key used for identification and can take up to
five parameters. In the parameter values, you can use variables as set in five parameters. In the parameter values, you can use variables as set in
installer::setValue(). For more information, see \l{Predefined Variables}. installer::setValue(). For more information, see \l{Predefined Variables}.

View File

@ -91,6 +91,10 @@
\printuntil } \printuntil }
\dots \dots
\l installer::addWizardPage() registers a new page to the installer. \l gui::pageWidgetByObjectName()
is then used to retrieve the root widget of the new page, with its name being \c "Dynamic" + the object
name of the root widget as set in the .ui file.
\section1 Generating the Example Installer \section1 Generating the Example Installer
To create the example installer, switch to the example source directory on To create the example installer, switch to the example source directory on

View File

@ -162,9 +162,10 @@ Component.prototype.readyToInstallWidgetEntered = function () {
var widget = gui.pageWidgetByObjectName("DynamicReadyToInstallWidget"); var widget = gui.pageWidgetByObjectName("DynamicReadyToInstallWidget");
if (widget != null) { if (widget != null) {
var html = "<b>Components to install:</b><ul>"; var html = "<b>Components to install:</b><ul>";
for (i = 0; i < installer.components.length; ++i) { var components = installer.components();
if (installer.components[i].installationRequested()) for (i = 0; i < components.length; ++i) {
html = html + "<li>" + installer.components[i].displayName + "</li>" if (components[i].installationRequested())
html = html + "<li>" + components[i].displayName + "</li>"
} }
html = html + "</ul>"; html = html + "</ul>";
widget.showDetailsBrowser.html = html; widget.showDetailsBrowser.html = html;

View File

@ -133,7 +133,7 @@ static const QLatin1String scForcedInstallation("ForcedInstallation");
The URLs are prefixed with \c {installer://}. The URLs are prefixed with \c {installer://}.
\sa addDownloadableArchive, removeDownloadableArchive \sa addDownloadableArchive(), removeDownloadableArchive()
*/ */
/*! /*!
@ -185,13 +185,7 @@ static const QLatin1String scForcedInstallation("ForcedInstallation");
/*! /*!
\fn Component::loaded() \fn Component::loaded()
Emitted when the component has been loaded. \sa {component::loaded}{component.loaded}
*/
/*!
\fn Component::selectedChanged(bool selected)
Emitted when the component selection changes to \a selected.
*/ */
/*! /*!
@ -199,13 +193,13 @@ static const QLatin1String scForcedInstallation("ForcedInstallation");
Emitted when the value of the variable with the name \a key changes to \a value. Emitted when the value of the variable with the name \a key changes to \a value.
\sa setValue \sa {component::valueChanged}{component.valueChanged}, setValue()
*/ */
/*! /*!
\fn Component::virtualStateChanged() \fn Component::virtualStateChanged()
Emitted when the virtual state of the component changes. \sa {component::virtualStateChanged}{component.virtualStateChanged}
*/ */
@ -384,7 +378,9 @@ QString Component::value(const QString &key, const QString &defaultValue) const
} }
/*! /*!
Sets the value of the variable \a key to \a value. Sets the value of the variable with \a key to \a value.
\sa {component::setValue}{component.setValue}
*/ */
void Component::setValue(const QString &key, const QString &value) void Component::setValue(const QString &key, const QString &value)
{ {
@ -653,6 +649,8 @@ QHash<QString, QPair<QString, QString> > Component::licenses() const
/*! /*!
Returns the QWidget created for \a name or \c 0 if the widget has been deleted or cannot Returns the QWidget created for \a name or \c 0 if the widget has been deleted or cannot
be found. be found.
\sa {component::userInterface}{component.userInterface}
*/ */
QWidget *Component::userInterface(const QString &name) const QWidget *Component::userInterface(const QString &name) const
{ {
@ -662,7 +660,7 @@ QWidget *Component::userInterface(const QString &name) const
/*! /*!
Creates all operations needed to install this component's \a path. \a path is a fully qualified Creates all operations needed to install this component's \a path. \a path is a fully qualified
filename including the component's name. This method gets called from filename including the component's name. This method gets called from
Component::createOperationsForArchive. You can override it by providing a method with createOperationsForArchive. You can override it by providing a method with
the same name in the component script. the same name in the component script.
\note RSA signature files are omitted by this method. \note RSA signature files are omitted by this method.
@ -671,6 +669,8 @@ QWidget *Component::userInterface(const QString &name) const
The default implementation is recursively creating Copy and Mkdir operations for all files The default implementation is recursively creating Copy and Mkdir operations for all files
and folders within \a path. and folders within \a path.
\sa {component::createOperationsForPath}{component.createOperationsForPath}
*/ */
void Component::createOperationsForPath(const QString &path) void Component::createOperationsForPath(const QString &path)
{ {
@ -715,6 +715,8 @@ void Component::createOperationsForPath(const QString &path)
The default implementation calls createOperationsForPath for everything contained in the archive. 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 If \a archive is a compressed archive known to the installer system, an Extract operation is
created, instead. created, instead.
\sa {component::createOperationsForArchive}{component.createOperationsForArchive}
*/ */
void Component::createOperationsForArchive(const QString &archive) void Component::createOperationsForArchive(const QString &archive)
{ {
@ -741,18 +743,7 @@ void Component::createOperationsForArchive(const QString &archive)
} }
/*! /*!
Starts the component installation. \sa {component::beginInstallation}{component.beginInstallation}
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
*/ */
void Component::beginInstallation() void Component::beginInstallation()
{ {
@ -761,14 +752,8 @@ void Component::beginInstallation()
} }
/*! /*!
Creates all operations needed to install this component. \sa {component::createOperations}{component.createOperations}
You can override this method by providing a method with the same name in the component script. \sa createOperationsForArchive()
\note If you call this method from a script, it will not call the script's method with the same
name.
The default implementation calls createOperationsForArchive() for all archives in this
component.
*/ */
void Component::createOperations() void Component::createOperations()
{ {
@ -789,6 +774,8 @@ void Component::createOperations()
Registers the file or directory at \a path for being removed when this component gets uninstalled. Registers the file or directory at \a path for being removed when this component gets uninstalled.
In case of a directory, this will be recursive. If \a wipe is set to \c true, the directory will In case of a directory, this will be recursive. If \a wipe is set to \c true, the directory will
also be deleted if it contains changes made by the user after installation. also be deleted if it contains changes made by the user after installation.
\sa {component::registerPathForUninstallation}{component.registerPathForUninstallation}
*/ */
void Component::registerPathForUninstallation(const QString &path, bool wipe) void Component::registerPathForUninstallation(const QString &path, bool wipe)
{ {
@ -822,7 +809,8 @@ QStringList Component::archives() const
downloaded from an online repository. When adding \a path, it will be downloaded from the downloaded from an online repository. When adding \a path, it will be downloaded from the
repository when the installation starts. repository when the installation starts.
\sa removeDownloadableArchive, fromOnlineRepository, archives \sa {component::addDownloadableArchive}{component.addDownloadableArchive}
\sa removeDownloadableArchive(), fromOnlineRepository, archives
*/ */
void Component::addDownloadableArchive(const QString &path) void Component::addDownloadableArchive(const QString &path)
{ {
@ -836,7 +824,8 @@ void Component::addDownloadableArchive(const QString &path)
Removes the archive \a path previously added via addDownloadableArchive() from this component. Removes the archive \a path previously added via addDownloadableArchive() from this component.
This can only be called if this component was downloaded from an online repository. This can only be called if this component was downloaded from an online repository.
\sa addDownloadableArchive, fromOnlineRepository, archives \sa {component::removeDownloadableArchive}{component.removeDownloadableArchive}
\sa addDownloadableArchive(), fromOnlineRepository, archives
*/ */
void Component::removeDownloadableArchive(const QString &path) void Component::removeDownloadableArchive(const QString &path)
{ {
@ -855,6 +844,8 @@ QStringList Component::downloadableArchives() const
/*! /*!
Adds a request for quitting the process \a process before installing, updating, or uninstalling Adds a request for quitting the process \a process before installing, updating, or uninstalling
the component. the component.
\sa {component::addStopProcessForUpdateRequest}{component.addStopProcessForUpdateRequest}
*/ */
void Component::addStopProcessForUpdateRequest(const QString &process) void Component::addStopProcessForUpdateRequest(const QString &process)
{ {
@ -863,6 +854,8 @@ void Component::addStopProcessForUpdateRequest(const QString &process)
/*! /*!
Removes the request for quitting the process \a process again. Removes the request for quitting the process \a process again.
\sa {component::removeStopProcessForUpdateRequest}{component.removeStopProcessForUpdateRequest}
*/ */
void Component::removeStopProcessForUpdateRequest(const QString &process) void Component::removeStopProcessForUpdateRequest(const QString &process)
{ {
@ -872,6 +865,8 @@ void Component::removeStopProcessForUpdateRequest(const QString &process)
/*! /*!
A convenience function for adding or removing the request for stopping \a process depending on A convenience function for adding or removing the request for stopping \a process depending on
whether \a requested is \c true (add) or \c false (remove). whether \a requested is \c true (add) or \c false (remove).
\sa {component::setStopProcessForUpdateRequest}{component.addStopProcessForUpdateReques}
*/ */
void Component::setStopProcessForUpdateRequest(const QString &process, bool requested) void Component::setStopProcessForUpdateRequest(const QString &process, bool requested)
{ {
@ -1006,6 +1001,8 @@ Operation *Component::createOperation(const QString &operationName, const QStrin
Convenience method for calling the operation \a operation with up to ten parameters: Convenience method for calling the operation \a operation with up to ten parameters:
\a parameter1, \a parameter2, \a parameter3, \a parameter4, \a parameter5, \a parameter6, \a parameter1, \a parameter2, \a parameter3, \a parameter4, \a parameter5, \a parameter6,
\a parameter7, \a parameter8, \a parameter9, and \a parameter10. \a parameter7, \a parameter8, \a parameter9, and \a parameter10.
\sa {component::addOperation}{component.addOperation}
*/ */
bool Component::addOperation(const QString &operation, const QString &parameter1, const QString &parameter2, bool Component::addOperation(const QString &operation, const QString &parameter1, const QString &parameter2,
const QString &parameter3, const QString &parameter4, const QString &parameter5, const QString &parameter6, const QString &parameter3, const QString &parameter4, const QString &parameter5, const QString &parameter6,
@ -1039,6 +1036,8 @@ bool Component::addOperation(const QString &operation, const QStringList &parame
Convenience method for calling the elevated operation \a operation with up to ten parameters: Convenience method for calling the elevated operation \a operation with up to ten parameters:
\a parameter1, \a parameter2, \a parameter3, \a parameter4, \a parameter5, \a parameter6, \a parameter1, \a parameter2, \a parameter3, \a parameter4, \a parameter5, \a parameter6,
\a parameter7, \a parameter8, \a parameter9, and \a parameter10. \a parameter7, \a parameter8, \a parameter9, and \a parameter10.
\sa {component::addElevatedOperation}{component.addElevatedOperation}
*/ */
bool Component::addElevatedOperation(const QString &operation, const QString &parameter1, bool Component::addElevatedOperation(const QString &operation, const QString &parameter1,
const QString &parameter2, const QString &parameter3, const QString &parameter4, const QString &parameter5, const QString &parameter2, const QString &parameter3, const QString &parameter4, const QString &parameter5,
@ -1074,6 +1073,8 @@ bool Component::addElevatedOperation(const QString &operation, const QStringList
Specifies whether operations should be automatically created when the installation starts. This Specifies whether operations should be automatically created when the installation starts. This
would be done by calling createOperations(). If you set this to \c false, it is completely up would be done by calling createOperations(). If you set this to \c false, it is completely up
to the component's script to create all operations. to the component's script to create all operations.
\sa {component::autoCreateOperations}{component.autoCreateOperations}
*/ */
bool Component::autoCreateOperations() const bool Component::autoCreateOperations() const
{ {
@ -1131,6 +1132,7 @@ bool Component::validatePage()
/*! /*!
Adds the component specified by \a newDependency to the list of dependencies. Adds the component specified by \a newDependency to the list of dependencies.
\sa {component::addDependency}{component.addDependency}
\sa dependencies \sa dependencies
*/ */
@ -1154,8 +1156,7 @@ QStringList Component::autoDependencies() const
} }
/*! /*!
\sa {component::setInstalled}{component.setInstalled}
Sets the component's state to installed.
*/ */
void Component::setInstalled() void Component::setInstalled()
{ {
@ -1166,6 +1167,8 @@ void Component::setInstalled()
Determines whether the component comes as an auto dependency. Returns \c true if all components Determines whether the component comes as an auto dependency. Returns \c true if all components
in \a componentsToInstall are already installed or selected for installation and this component in \a componentsToInstall are already installed or selected for installation and this component
thus needs to be installed as well. thus needs to be installed as well.
\sa {component::isAutoDependOn}{component.isAutoDependOn}
*/ */
bool Component::isAutoDependOn(const QSet<QString> &componentsToInstall) const bool Component::isAutoDependOn(const QSet<QString> &componentsToInstall) const
{ {
@ -1225,7 +1228,9 @@ bool Component::isInstalled() const
} }
/*! /*!
Returns whether the user wants to install the component Returns whether the user wants to install the component.
\sa {component::installationRequested}{component.installationRequested}
*/ */
bool Component::installationRequested() const bool Component::installationRequested() const
{ {
@ -1242,6 +1247,8 @@ bool Component::isSelectedForInstallation() const
/*! /*!
Sets the \a isUpdateAvailable flag to \c true to indicate that the core found an update. Sets the \a isUpdateAvailable flag to \c true to indicate that the core found an update.
\sa {component::setUpdateAvailable}{component.setUpdateAvailable}
*/ */
void Component::setUpdateAvailable(bool isUpdateAvailable) void Component::setUpdateAvailable(bool isUpdateAvailable)
{ {
@ -1249,7 +1256,9 @@ void Component::setUpdateAvailable(bool isUpdateAvailable)
} }
/*! /*!
Returns whether the user wants to install the update for this component Returns whether the user wants to install the update for this component.
\sa {component::updateRequested}{component.updateRequested}
*/ */
bool Component::updateRequested() bool Component::updateRequested()
{ {
@ -1258,6 +1267,8 @@ bool Component::updateRequested()
/*! /*!
Returns \c true if that component will be changed (update, installation, or uninstallation). Returns \c true if that component will be changed (update, installation, or uninstallation).
\sa {component::componentChangeRequested}{component.componentChangeRequested}
*/ */
bool Component::componentChangeRequested() bool Component::componentChangeRequested()
{ {
@ -1266,7 +1277,7 @@ bool Component::componentChangeRequested()
/*! /*!
Sets the component state to uninstalled. \sa {component::setUninstalled}{component.setUninstalled}
*/ */
void Component::setUninstalled() void Component::setUninstalled()
{ {
@ -1275,6 +1286,8 @@ void Component::setUninstalled()
/*! /*!
Returns whether the component is uninstalled. Returns whether the component is uninstalled.
\sa {component::isUninstalled}{component.isUninstalled}
*/ */
bool Component::isUninstalled() const bool Component::isUninstalled() const
{ {
@ -1283,6 +1296,8 @@ bool Component::isUninstalled() const
/*! /*!
Returns whether the user wants to uninstall the component. Returns whether the user wants to uninstall the component.
\sa {component::uninstallationRequested}{component.uninstallationRequested}
*/ */
bool Component::uninstallationRequested() const bool Component::uninstallationRequested() const
{ {
@ -1294,7 +1309,8 @@ bool Component::uninstallationRequested() const
/*! /*!
Returns whether this component has been loaded from an online repository. Returns whether this component has been loaded from an online repository.
\sa addDownloadableArchive, fromOnlineRepository \sa {component::isFromOnlineRepository}{component.isFromOnlineRepository}
\sa addDownloadableArchive(), fromOnlineRepository
*/ */
bool Component::isFromOnlineRepository() const bool Component::isFromOnlineRepository() const
{ {

View File

@ -203,7 +203,6 @@ public Q_SLOTS:
Q_SIGNALS: Q_SIGNALS:
void loaded(); void loaded();
void virtualStateChanged(); void virtualStateChanged();
void selectedChanged(bool selected);
void valueChanged(const QString &key, const QString &value); void valueChanged(const QString &key, const QString &value);
private Q_SLOTS: private Q_SLOTS:

View File

@ -89,6 +89,7 @@ void registerArc7z();
void registerCodecBCJ(); void registerCodecBCJ();
void registerCodecBCJ2(); void registerCodecBCJ2();
void registerCodecCopy();
void registerCodecLZMA(); void registerCodecLZMA();
void registerCodecLZMA2(); void registerCodecLZMA2();
@ -107,6 +108,8 @@ static void initArchives()
registerCodecBCJ(); registerCodecBCJ();
registerCodecBCJ2(); registerCodecBCJ2();
registerCodecCopy();
registerCodecLZMA(); registerCodecLZMA();
registerCodecLZMA2(); registerCodecLZMA2();

View File

@ -1141,12 +1141,13 @@ void Lib7z::createArchive(QFileDevice *archive, const QStringList &sourcePaths,
NWildcard::CCensor censor; NWildcard::CCensor censor;
foreach (const QString &path, sourcePaths) { foreach (const QString &path, sourcePaths) {
const UString sourcePath = QString2UString(QDir::toNativeSeparators(path)); const QString cleanPath = QDir::toNativeSeparators(QDir::cleanPath(path));
if (UString2QString(sourcePath) != QDir::toNativeSeparators(path)) const UString nativePath = QString2UString(cleanPath);
throw UString2QString(sourcePath).toLatin1().data(); if (UString2QString(nativePath) != cleanPath) {
// Only pass recursive with true if path is a directory, otherwise we include the file and throw SevenZipException(QCoreApplication::translate("Lib7z", "Could not convert"
// possible folders located on the same directory level as the file into the created archive. "path: %1.").arg(path));
censor.AddItem(true, sourcePath, QFileInfo(path).isDir()); }
censor.AddItem(true /* always include item */, nativePath, false /* never recurse*/);
} }
callback->setSourcePaths(sourcePaths); callback->setSourcePaths(sourcePaths);

File diff suppressed because it is too large Load Diff

View File

@ -997,6 +997,15 @@ void PackageManagerCorePrivate::writeMaintenanceToolBinary(QFile *const input, q
QInstaller::appendInt64(&dataOut, 4 * sizeof(qint64)); // data block size QInstaller::appendInt64(&dataOut, 4 * sizeof(qint64)); // data block size
QInstaller::appendInt64(&dataOut, BinaryContent::MagicUninstallerMarker); QInstaller::appendInt64(&dataOut, BinaryContent::MagicUninstallerMarker);
QInstaller::appendInt64(&dataOut, BinaryContent::MagicCookie); QInstaller::appendInt64(&dataOut, BinaryContent::MagicCookie);
{
QFile dummy(resourcePath.filePath(QLatin1String("installer.dat")));
if (dummy.exists() && !dummy.remove()) {
throw Error(tr("Could not remove data file '%1': %2").arg(dummy.fileName(),
dummy.errorString()));
}
}
if (!dataOut.rename(resourcePath.filePath(QLatin1String("installer.dat")))) { if (!dataOut.rename(resourcePath.filePath(QLatin1String("installer.dat")))) {
throw Error(tr("Could not write maintenance tool data to %1: %2").arg(out.fileName(), throw Error(tr("Could not write maintenance tool data to %1: %2").arg(out.fileName(),
out.errorString())); out.errorString()));

View File

@ -250,28 +250,27 @@ public:
/*! /*!
\fn void PackageManagerGui::interrupted() \fn void PackageManagerGui::interrupted()
This signal is emitted when the end user chooses to cancel the installation \sa {gui::interrupted}{gui.interrupted}
and quit the installer.
*/ */
/*! /*!
\fn void PackageManagerGui::languageChanged() \fn void PackageManagerGui::languageChanged()
This signal is emitted when the application language changes. \sa {gui::languageChanged}{gui.languageChanged}
*/ */
/*! /*!
\fn void PackageManagerGui::finishButtonClicked() \fn void PackageManagerGui::finishButtonClicked()
This signal is emitted when the \uicontrol Finish button is clicked. \sa {gui::finishButtonClicked}{gui.finishButtonClicked}
*/ */
/*! /*!
\fn void PackageManagerGui::gotRestarted() \fn void PackageManagerGui::gotRestarted()
This signal is emitted when the installer is restarted. \sa {gui::gotRestarted}{gui.gotRestarted}
*/ */
/*! /*!
\fn void PackageManagerGui::settingsButtonClicked() \fn void PackageManagerGui::settingsButtonClicked()
This signal is emitted when the \uicontrol Settings button is clicked. \sa {gui::settingsButtonClicked}{gui.settingsButtonClicked}
*/ */
/*! /*!
@ -411,6 +410,8 @@ void PackageManagerGui::setAutomatedPageSwitchEnabled(bool request)
/*! /*!
Returns the default text for the button specified by \a wizardButton. Returns the default text for the button specified by \a wizardButton.
\sa {gui::defaultButtonText}{gui.defaultButtonText}
*/ */
QString PackageManagerGui::defaultButtonText(int wizardButton) const QString PackageManagerGui::defaultButtonText(int wizardButton) const
{ {
@ -439,6 +440,8 @@ static bool swapFinishButton(PackageManagerCore *core, int currentId, int button
/*! /*!
Clicks the button specified by \a wb after the delay specified by \a delay. Clicks the button specified by \a wb after the delay specified by \a delay.
\sa {gui::clickButton}{gui.clickButton}
*/ */
void PackageManagerGui::clickButton(int wb, int delay) void PackageManagerGui::clickButton(int wb, int delay)
{ {
@ -456,6 +459,8 @@ void PackageManagerGui::clickButton(int wb, int delay)
/*! /*!
Returns \c true if the button specified by \a wb is enabled. Returns \c false Returns \c true if the button specified by \a wb is enabled. Returns \c false
if a button of the specified type is not found. if a button of the specified type is not found.
\sa {gui::isButtonEnabled}{gui.isButtonEnabled}
*/ */
bool PackageManagerGui::isButtonEnabled(int wb) bool PackageManagerGui::isButtonEnabled(int wb)
{ {
@ -661,6 +666,8 @@ void PackageManagerGui::wizardPageVisibilityChangeRequested(bool visible, int p)
/*! /*!
Returns the page specified by \a id. Returns the page specified by \a id.
\sa {gui::pageById}{gui.pageById}
*/ */
QWidget *PackageManagerGui::pageById(int id) const QWidget *PackageManagerGui::pageById(int id) const
{ {
@ -669,6 +676,8 @@ QWidget *PackageManagerGui::pageById(int id) const
/*! /*!
Returns the page specified by the object name \a name from a UI file. Returns the page specified by the object name \a name from a UI file.
\sa {gui::pageByObjectName}{gui.pageByObjectName}
*/ */
QWidget *PackageManagerGui::pageByObjectName(const QString &name) const QWidget *PackageManagerGui::pageByObjectName(const QString &name) const
{ {
@ -683,7 +692,7 @@ QWidget *PackageManagerGui::pageByObjectName(const QString &name) const
} }
/*! /*!
Returns the current page. \sa {gui::currentPageWidget}{gui.currentPageWidget}
*/ */
QWidget *PackageManagerGui::currentPageWidget() const QWidget *PackageManagerGui::currentPageWidget() const
{ {
@ -693,6 +702,8 @@ QWidget *PackageManagerGui::currentPageWidget() const
/*! /*!
For dynamic pages, returns the widget specified by \a name read from the UI For dynamic pages, returns the widget specified by \a name read from the UI
file. file.
\sa {gui::pageWidgetByObjectName}{gui.pageWidgetByObjectName}
*/ */
QWidget *PackageManagerGui::pageWidgetByObjectName(const QString &name) const QWidget *PackageManagerGui::pageWidgetByObjectName(const QString &name) const
{ {
@ -709,8 +720,7 @@ QWidget *PackageManagerGui::pageWidgetByObjectName(const QString &name) const
} }
/*! /*!
Asks end users whether they want to cancel the operation and quit the installer, uninstaller, \sa {gui::cancelButtonClicked}{gui.cancelButtonClicked}
or package manager.
*/ */
void PackageManagerGui::cancelButtonClicked() void PackageManagerGui::cancelButtonClicked()
{ {
@ -752,8 +762,7 @@ void PackageManagerGui::cancelButtonClicked()
} }
/*! /*!
Quits the installer, uninstaller, or package manager without asking end \sa {gui::rejectWithoutPrompt}{gui.rejectWithoutPrompt}
users for confirmation.
*/ */
void PackageManagerGui::rejectWithoutPrompt() void PackageManagerGui::rejectWithoutPrompt()
{ {
@ -777,7 +786,7 @@ void PackageManagerGui::setModified(bool value)
} }
/*! /*!
Shows the next page. \sa {gui::showFinishedPage}{gui.showFinishedPage}
*/ */
void PackageManagerGui::showFinishedPage() void PackageManagerGui::showFinishedPage()
{ {
@ -790,6 +799,8 @@ void PackageManagerGui::showFinishedPage()
/*! /*!
Shows the \uicontrol Settings button if \a show is \c true. Shows the \uicontrol Settings button if \a show is \c true.
\sa {gui::showSettingsButton}{gui.showSettingsButton}
*/ */
void PackageManagerGui::showSettingsButton(bool show) void PackageManagerGui::showSettingsButton(bool show)
{ {
@ -841,6 +852,8 @@ void PackageManagerGui::updateButtonLayout()
/*! /*!
Enables the \uicontrol Settings button by setting \a enabled to \c true. Enables the \uicontrol Settings button by setting \a enabled to \c true.
\sa {gui::setSettingsButtonEnabled}{gui.setSettingsButtonEnabled}
*/ */
void PackageManagerGui::setSettingsButtonEnabled(bool enabled) void PackageManagerGui::setSettingsButtonEnabled(bool enabled)
{ {

View File

@ -65,8 +65,6 @@ void sendPacket(QIODevice *device, const QByteArray &command, const QByteArray &
break; break;
packet.remove(0, bytesWritten); packet.remove(0, bytesWritten);
} }
// needed for big packages over TCP on Windows
device->waitForBytesWritten(-1);
} }
/*! /*!

View File

@ -106,6 +106,7 @@ bool RemoteObject::connectToServer(const QVariantList &arguments)
out << arg; out << arg;
sendPacket(m_socket, Protocol::Create, data); sendPacket(m_socket, Protocol::Create, data);
m_socket->flush();
return true; return true;
} }

View File

@ -151,6 +151,7 @@ private:
out << arg3; out << arg3;
sendPacket(m_socket, name.toLatin1(), data); sendPacket(m_socket, name.toLatin1(), data);
m_socket->flush();
} }
private: private:

View File

@ -165,6 +165,7 @@ void RemoteServerConnection::run()
if (m_signalReceiver) { if (m_signalReceiver) {
QMutexLocker _(&m_signalReceiver->m_lock); QMutexLocker _(&m_signalReceiver->m_lock);
sendData(&socket, m_signalReceiver->m_receivedSignals); sendData(&socket, m_signalReceiver->m_receivedSignals);
socket.flush();
m_signalReceiver->m_receivedSignals.clear(); m_signalReceiver->m_receivedSignals.clear();
} }
continue; continue;
@ -179,6 +180,7 @@ void RemoteServerConnection::run()
} else { } else {
qDebug() << "Unknown command:" << command; qDebug() << "Unknown command:" << command;
} }
socket.flush();
} else { } else {
// authorization failed, connection not wanted // authorization failed, connection not wanted
socket.close(); socket.close();

View File

@ -319,6 +319,10 @@ QJSValue ScriptEngine::newQObject(QObject *object)
return jsValue; return jsValue;
} }
/*!
Creates a JavaScript object of class Array with the specified \a length.
*/
QJSValue ScriptEngine::newArray(uint length) QJSValue ScriptEngine::newArray(uint length)
{ {
return m_engine.newArray(length); return m_engine.newArray(length);

View File

@ -57,7 +57,7 @@ CommandLineParser::CommandLineParser()
QLatin1String("Verbose mode. Prints out more information."))); QLatin1String("Verbose mode. Prints out more information.")));
m_parser.addOption(QCommandLineOption(QLatin1String(CommandLineOptions::Proxy), m_parser.addOption(QCommandLineOption(QLatin1String(CommandLineOptions::Proxy),
QLatin1String("Use system proxy on Windows and OS X. This option has no effect on Linux."))); QLatin1String("Use system proxy on Windows and Linux. This option has no effect on OS X.")));
m_parser.addOption(QCommandLineOption(QLatin1String(CommandLineOptions::Script), m_parser.addOption(QCommandLineOption(QLatin1String(CommandLineOptions::Script),
QLatin1String("Execute the script given as argument."), QLatin1String("file"))); QLatin1String("Execute the script given as argument."), QLatin1String("file")));

View File

@ -50,6 +50,11 @@
#include <iostream> #include <iostream>
#if defined(Q_OS_OSX)
# include <unistd.h>
# include <sys/types.h>
#endif
#define QUOTE_(x) #x #define QUOTE_(x) #x
#define QUOTE(x) QUOTE_(x) #define QUOTE(x) QUOTE_(x)
#define VERSION "IFW Version: \"" QUOTE(IFW_VERSION_STR) "\"" #define VERSION "IFW Version: \"" QUOTE(IFW_VERSION_STR) "\""
@ -144,6 +149,14 @@ int main(int argc, char *argv[])
return EXIT_FAILURE; return EXIT_FAILURE;
} }
#if defined(Q_OS_OSX)
// make sure effective == real user id.
uid_t realUserId = getuid();
uid_t effectiveUserId = geteuid();
if (realUserId != effectiveUserId)
setreuid(effectiveUserId, -1);
#endif
QInstaller::RemoteServer *server = new QInstaller::RemoteServer; QInstaller::RemoteServer *server = new QInstaller::RemoteServer;
QObject::connect(server, SIGNAL(destroyed()), &app, SLOT(quit())); QObject::connect(server, SIGNAL(destroyed()), &app, SLOT(quit()));
server->init(socketName, key, (production ? QInstaller::Protocol::Mode::Production server->init(socketName, key, (production ? QInstaller::Protocol::Mode::Production

View File

@ -90,7 +90,12 @@ class tst_PackageManagerCore : public QObject
private: private:
void setIgnoreMessage(const QString &testDirectory) void setIgnoreMessage(const QString &testDirectory)
{ {
#if QT_VERSION < QT_VERSION_CHECK(5, 5, 0)
const QString message = "\"\t- arguments: %1\" "; const QString message = "\"\t- arguments: %1\" ";
#else
const QString message = "\"\\t- arguments: %1\" ";
#endif
QTest::ignoreMessage(QtDebugMsg, "Operations sanity check succeeded.");
QTest::ignoreMessage(QtDebugMsg, "\"backup operation: Mkdir\" "); QTest::ignoreMessage(QtDebugMsg, "\"backup operation: Mkdir\" ");
QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(testDirectory))); QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(testDirectory)));
QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(testDirectory))); QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(testDirectory)));
@ -233,6 +238,7 @@ private slots:
void testRequiredDiskSpace() void testRequiredDiskSpace()
{ {
// test installer // test installer
QTest::ignoreMessage(QtDebugMsg, "Operations sanity check succeeded.");
PackageManagerCore core(QInstaller::BinaryContent::MagicInstallerMarker, PackageManagerCore core(QInstaller::BinaryContent::MagicInstallerMarker,
QList<QInstaller::OperationBlob>()); QList<QInstaller::OperationBlob>());