4
0
mirror of https://github.com/QuasarApp/installer-framework.git synced 2025-05-04 01:09:33 +00:00

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

@ -5,7 +5,12 @@
- Fix --checkupdates mode.
- Prevent disabled component to be selected using the Select All button. (QTIFW-635)
- 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)
- 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.
2.0.0

11
INSTALL

@ -26,13 +26,13 @@ See the Qt documentation for the prerequisites and steps to build Qt from source
### Windows
Adjust the qmake.conf to have a real stand alone working installer:
Replace -MD, -MDd with -MT, -MTD in the CFLAGS lines
For Qt 5.4, you need to adjust the respective qmake.conf to have a real stand alone
working installer. Replace -MD, -MDd with -MT, -MTD in the CFLAGS lines.
'git diff' should show you something like:
--- a/mkspecs/win32-msvc20XX/qmake.conf
+++ b/mkspecs/win32-msvc20XX/qmake.conf
--- a/mkspecs/win32-msvc2013/qmake.conf
+++ b/mkspecs/win32-msvc2013/qmake.conf
QMAKE_CFLAGS = -nologo -Zm200 -Zc:wchar_t -FS
QMAKE_CFLAGS_WARN_ON = -W3
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_MP = -MP
From Qt 5.5 onwards, you can achieve the same by passing -static-runtime to
configure.
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

@ -1,9 +1,9 @@
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/
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.
-------------------------------------------------------------------------

@ -1,9 +1,9 @@
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/
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.
-------------------------------------------------------------------------

Binary file not shown.

Before

(image error) Size: 34 KiB

After

(image error) Size: 8.4 KiB

Binary file not shown.

Before

(image error) Size: 34 KiB

After

(image error) Size: 12 KiB

@ -71,11 +71,12 @@
\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
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
'-MD' with '-MT':

@ -716,6 +716,8 @@
\li \l archivegen
\li \l devtool
\endlist
\section1 installerbase
@ -737,7 +739,7 @@
###TODO insert link here.
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
\c installerbase tool.
@ -936,6 +938,53 @@
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
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
*/
/*!

@ -34,7 +34,11 @@
\title Controller Scripting
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.
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
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
}
}

@ -114,10 +114,8 @@
In addition, a special argument, UNDOEXECUTE, separates the DO step of the operation
from the UNDO step.
example:
\code
component.addOperation("Execute", "touch", "test.txt", "UNDOEXECUTE", "rm", "test.txt")
\endcode
Example:
\c{component.addOperation("Execute", "touch", "test.txt", "UNDOEXECUTE", "rm", "test.txt")}
\row
\li CreateShortcut
\li "CreateShortcut" \c filename \c linkname [\c arguments]
@ -127,7 +125,7 @@
\c arguments. On Unix, this creates a symbolic link.
\row
\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
freedesktop.org.
@ -173,7 +171,7 @@
registry) or by \c application and \c company name. Set \c 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
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

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

@ -156,16 +156,11 @@
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)
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
*/
@ -180,8 +175,9 @@
\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.
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)
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
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.
\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
and folders within \a path.
@ -221,10 +219,11 @@
\qmlmethod void component::createOperationsForArchive(string archive)
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.
\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.
If \a archive is a compressed archive known to the installer system, an Extract operation is
@ -251,11 +250,20 @@
\qmlmethod void component::createOperations()
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.
\sa component::addOperation()
*/
/*!
@ -288,8 +296,8 @@
/*!
\qmlmethod void component::addStopProcessForUpdateRequest(string process)
Adds a request for quitting the process \a process before installing/updating/uninstalling the
component.
Adds a request for quitting the process \a process before installing,
updating, or uninstalling the component.
*/
/*!
@ -301,13 +309,9 @@
/*!
\qmlmethod void component::setStopProcessForUpdateRequest(string process, boolean requested)
Convenience: Add/remove request depending on \a requested (add if \c true, remove if \c false).
*/
/*!
\qmlmethod boolean component::addOperation(string operation, string parameter1 = "", string parameter2 = "", ..., string parameter10 = "")
Convenience method for calling addOperation(string, stringlist) with up to 10 arguments.
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).
*/
/*!
@ -316,6 +320,14 @@
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.
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)
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.
*/
@ -372,31 +384,32 @@
/*!
\qmlmethod boolean component::isInstalled()
Determines if the component is installed.
Determines whether the component is installed.
*/
/*!
\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)
Sets a flag that the core found an update
Sets a flag that the core found an update.
*/
/*!
\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()
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()
Determines if the component is uninstalled.
Determines whether the component is uninstalled.
*/
/*!
\qmlmethod boolean component::uninstallationRequested()
Determines if the user wants to uninstall the component.
Determines whether the user wants to uninstall the component.
*/
/*!

@ -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.
*/

@ -121,6 +121,10 @@
component::addOperation(). If you need to run an operation that requires
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
five parameters. In the parameter values, you can use variables as set in
installer::setValue(). For more information, see \l{Predefined Variables}.

@ -91,6 +91,10 @@
\printuntil }
\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
To create the example installer, switch to the example source directory on

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

@ -133,7 +133,7 @@ static const QLatin1String scForcedInstallation("ForcedInstallation");
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()
Emitted when the component has been loaded.
*/
/*!
\fn Component::selectedChanged(bool selected)
Emitted when the component selection changes to \a selected.
\sa {component::loaded}{component.loaded}
*/
/*!
@ -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.
\sa setValue
\sa {component::valueChanged}{component.valueChanged}, setValue()
*/
/*!
\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)
{
@ -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
be found.
\sa {component::userInterface}{component.userInterface}
*/
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
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.
\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
and folders within \a path.
\sa {component::createOperationsForPath}{component.createOperationsForPath}
*/
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.
If \a archive is a compressed archive known to the installer system, an Extract operation is
created, instead.
\sa {component::createOperationsForArchive}{component.createOperationsForArchive}
*/
void Component::createOperationsForArchive(const QString &archive)
{
@ -741,18 +743,7 @@ void Component::createOperationsForArchive(const QString &archive)
}
/*!
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
\sa {component::beginInstallation}{component.beginInstallation}
*/
void Component::beginInstallation()
{
@ -761,14 +752,8 @@ void Component::beginInstallation()
}
/*!
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 will not call the script's method with the same
name.
The default implementation calls createOperationsForArchive() for all archives in this
component.
\sa {component::createOperations}{component.createOperations}
\sa createOperationsForArchive()
*/
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.
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.
\sa {component::registerPathForUninstallation}{component.registerPathForUninstallation}
*/
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
repository when the installation starts.
\sa removeDownloadableArchive, fromOnlineRepository, archives
\sa {component::addDownloadableArchive}{component.addDownloadableArchive}
\sa removeDownloadableArchive(), fromOnlineRepository, archives
*/
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.
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)
{
@ -855,6 +844,8 @@ QStringList Component::downloadableArchives() const
/*!
Adds a request for quitting the process \a process before installing, updating, or uninstalling
the component.
\sa {component::addStopProcessForUpdateRequest}{component.addStopProcessForUpdateRequest}
*/
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.
\sa {component::removeStopProcessForUpdateRequest}{component.removeStopProcessForUpdateRequest}
*/
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
whether \a requested is \c true (add) or \c false (remove).
\sa {component::setStopProcessForUpdateRequest}{component.addStopProcessForUpdateReques}
*/
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:
\a parameter1, \a parameter2, \a parameter3, \a parameter4, \a parameter5, \a parameter6,
\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,
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:
\a parameter1, \a parameter2, \a parameter3, \a parameter4, \a parameter5, \a parameter6,
\a parameter7, \a parameter8, \a parameter9, and \a parameter10.
\sa {component::addElevatedOperation}{component.addElevatedOperation}
*/
bool Component::addElevatedOperation(const QString &operation, const QString &parameter1,
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
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.
\sa {component::autoCreateOperations}{component.autoCreateOperations}
*/
bool Component::autoCreateOperations() const
{
@ -1131,6 +1132,7 @@ bool Component::validatePage()
/*!
Adds the component specified by \a newDependency to the list of dependencies.
\sa {component::addDependency}{component.addDependency}
\sa dependencies
*/
@ -1154,8 +1156,7 @@ QStringList Component::autoDependencies() const
}
/*!
Sets the component's state to installed.
\sa {component::setInstalled}{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
in \a componentsToInstall are already installed or selected for installation and this component
thus needs to be installed as well.
\sa {component::isAutoDependOn}{component.isAutoDependOn}
*/
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
{
@ -1242,6 +1247,8 @@ bool Component::isSelectedForInstallation() const
/*!
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)
{
@ -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()
{
@ -1258,6 +1267,8 @@ bool Component::updateRequested()
/*!
Returns \c true if that component will be changed (update, installation, or uninstallation).
\sa {component::componentChangeRequested}{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()
{
@ -1275,6 +1286,8 @@ void Component::setUninstalled()
/*!
Returns whether the component is uninstalled.
\sa {component::isUninstalled}{component.isUninstalled}
*/
bool Component::isUninstalled() const
{
@ -1283,6 +1296,8 @@ bool Component::isUninstalled() const
/*!
Returns whether the user wants to uninstall the component.
\sa {component::uninstallationRequested}{component.uninstallationRequested}
*/
bool Component::uninstallationRequested() const
{
@ -1294,7 +1309,8 @@ bool Component::uninstallationRequested() const
/*!
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
{

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

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

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

File diff suppressed because it is too large Load Diff

@ -997,6 +997,15 @@ void PackageManagerCorePrivate::writeMaintenanceToolBinary(QFile *const input, q
QInstaller::appendInt64(&dataOut, 4 * sizeof(qint64)); // data block size
QInstaller::appendInt64(&dataOut, BinaryContent::MagicUninstallerMarker);
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")))) {
throw Error(tr("Could not write maintenance tool data to %1: %2").arg(out.fileName(),
out.errorString()));

@ -250,28 +250,27 @@ public:
/*!
\fn void PackageManagerGui::interrupted()
This signal is emitted when the end user chooses to cancel the installation
and quit the installer.
\sa {gui::interrupted}{gui.interrupted}
*/
/*!
\fn void PackageManagerGui::languageChanged()
This signal is emitted when the application language changes.
\sa {gui::languageChanged}{gui.languageChanged}
*/
/*!
\fn void PackageManagerGui::finishButtonClicked()
This signal is emitted when the \uicontrol Finish button is clicked.
\sa {gui::finishButtonClicked}{gui.finishButtonClicked}
*/
/*!
\fn void PackageManagerGui::gotRestarted()
This signal is emitted when the installer is restarted.
\sa {gui::gotRestarted}{gui.gotRestarted}
*/
/*!
\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.
\sa {gui::defaultButtonText}{gui.defaultButtonText}
*/
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.
\sa {gui::clickButton}{gui.clickButton}
*/
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
if a button of the specified type is not found.
\sa {gui::isButtonEnabled}{gui.isButtonEnabled}
*/
bool PackageManagerGui::isButtonEnabled(int wb)
{
@ -661,6 +666,8 @@ void PackageManagerGui::wizardPageVisibilityChangeRequested(bool visible, int p)
/*!
Returns the page specified by \a id.
\sa {gui::pageById}{gui.pageById}
*/
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.
\sa {gui::pageByObjectName}{gui.pageByObjectName}
*/
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
{
@ -693,6 +702,8 @@ QWidget *PackageManagerGui::currentPageWidget() const
/*!
For dynamic pages, returns the widget specified by \a name read from the UI
file.
\sa {gui::pageWidgetByObjectName}{gui.pageWidgetByObjectName}
*/
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,
or package manager.
\sa {gui::cancelButtonClicked}{gui.cancelButtonClicked}
*/
void PackageManagerGui::cancelButtonClicked()
{
@ -752,8 +762,7 @@ void PackageManagerGui::cancelButtonClicked()
}
/*!
Quits the installer, uninstaller, or package manager without asking end
users for confirmation.
\sa {gui::rejectWithoutPrompt}{gui.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()
{
@ -790,6 +799,8 @@ void PackageManagerGui::showFinishedPage()
/*!
Shows the \uicontrol Settings button if \a show is \c true.
\sa {gui::showSettingsButton}{gui.showSettingsButton}
*/
void PackageManagerGui::showSettingsButton(bool show)
{
@ -841,6 +852,8 @@ void PackageManagerGui::updateButtonLayout()
/*!
Enables the \uicontrol Settings button by setting \a enabled to \c true.
\sa {gui::setSettingsButtonEnabled}{gui.setSettingsButtonEnabled}
*/
void PackageManagerGui::setSettingsButtonEnabled(bool enabled)
{

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

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

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

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

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

@ -57,7 +57,7 @@ CommandLineParser::CommandLineParser()
QLatin1String("Verbose mode. Prints out more information.")));
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),
QLatin1String("Execute the script given as argument."), QLatin1String("file")));

@ -50,6 +50,11 @@
#include <iostream>
#if defined(Q_OS_OSX)
# include <unistd.h>
# include <sys/types.h>
#endif
#define QUOTE_(x) #x
#define QUOTE(x) QUOTE_(x)
#define VERSION "IFW Version: \"" QUOTE(IFW_VERSION_STR) "\""
@ -144,6 +149,14 @@ int main(int argc, char *argv[])
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;
QObject::connect(server, SIGNAL(destroyed()), &app, SLOT(quit()));
server->init(socketName, key, (production ? QInstaller::Protocol::Mode::Production

@ -90,7 +90,12 @@ class tst_PackageManagerCore : public QObject
private:
void setIgnoreMessage(const QString &testDirectory)
{
#if QT_VERSION < QT_VERSION_CHECK(5, 5, 0)
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, qPrintable(message.arg(testDirectory)));
QTest::ignoreMessage(QtDebugMsg, qPrintable(message.arg(testDirectory)));
@ -233,6 +238,7 @@ private slots:
void testRequiredDiskSpace()
{
// test installer
QTest::ignoreMessage(QtDebugMsg, "Operations sanity check succeeded.");
PackageManagerCore core(QInstaller::BinaryContent::MagicInstallerMarker,
QList<QInstaller::OperationBlob>());