summaryrefslogtreecommitdiffstats
path: root/tools/binarycreator/binarycreator.cpp
Commit message (Collapse)AuthorAgeFilesLines
* Tools: refactor to move general purpose functionality to installer libArttu Tarkiainen2020-12-021-1043/+0
| | | | | | | | | This makes it possible to utilize parts of our existing tooling in the offline installer from online installer generation process. Task-number: QTIFW-2048 Change-Id: I7ee605be75541cc83a3b6909089bda45f0835bcf Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* Repogen: Fix options to work with unite metadataKatja Marttila2020-10-151-1/+1
| | | | | | | | | | | | | | Fixed regogen 'update' and 'repository' options to work with unite metadata. --update-new-components with unify metadata is prevented. Moved --update-new-components functionality from repogen.cpp to QInstallerTools so it can be accessed from tests. Created tests for repogen. Task-number: QTIFW-1943 Change-Id: I12389f4747154a0f6f51b4f34f630103c2cfef04 Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
* Add support for vendor set image decorationArttu Tarkiainen2020-08-251-0/+15
| | | | | | | | | | | | Add possibility to show an arbitrary number of product related, or other images on PerformInstallationPage. These can be specified in the installer configuration file, using <ProductImages> element with one <Image> child element for each file name. Task-number: QTIFW-1900 Change-Id: I2be727d9189963ef1a79046150111dd8c91153c6 Reviewed-by: Iikka Eklund <iikka.eklund@qt.io> Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* Fix installer executable creation in Linux3.1.2-rc3Katja Marttila2019-11-191-2/+2
| | | | | | | | | | | If Linux has several partitions and tmp is pointing to a different partition than where we are trying to create installer executable with binarycreator, binarycreator fails with 'Invalid cross-device link'. Fixed so that tmp is not used when creating an installer executable. Change-Id: Ieee52ee1929f980345a7940dd381cc94dbf3d40e Reviewed-by: Iikka Eklund <iikka.eklund@qt.io> Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* Update usage of Apple-related terminologyArttu Tarkiainen2019-08-161-9/+9
| | | | | | | | | | | Replace deprecated Q_OS_OSX macro used in several places with the newer Q_OS_MACOS. Old style reference of Apple's desktop operating system name as "OS X" in documentation and files are also replaced with "macOS" where applicable. Task-number: QTIFW-1406 Change-Id: I0561d5e0d964917ac4fca0702d58a06b85d30e57 Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* Fix IFW version information not apparent on macOSArttu Tarkiainen2019-08-151-1/+4
| | | | | | | | | | | | On macOS remove the use of obsolete CFBundleGetInfoString, replace with CFBundleVersion and CFBundleShortVersionString respectively so that the bundle's properties in Info.plist are up to date and version shows correctly. Task-number: QTIFW-1396 Change-Id: Iac03478e266d9d2994ecdf3b229e63976d683ac0 Reviewed-by: Iikka Eklund <iikka.eklund@qt.io> Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* Replace 0 with nullptrKatja Marttila2019-01-091-1/+1
| | | | | | | Prevents a lot of warnings seen in QtCreator Change-Id: I63bf95aca68a04fc9fd0eecbe29c63e9b9c47efd Reviewed-by: Iikka Eklund <iikka.eklund@qt.io>
* Merge remote-tracking branch 'origin/3.0' into masterKatja Marttila2018-12-101-0/+7
|\ | | | | | | Change-Id: I73cb43e090c6ff34f1ceb774490d01818465e2e0
| * Increase number of files allowed for macOSBrett Stottlemyer2018-11-071-0/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This addressed the following error: [29065] Critical: Error occurred while assembling the installer: Cannot open resource <some file>: Too many open files libc++abi.dylib: terminating with uncaught exception of type QInstaller::Error: std::exception Abort trap: 6 Kai from TQtC suggested the fix used in commit: 8f8800de7ab89e6cbc7b5eb08f2b3f16407e6cdf Applying it to binarycreator fixed the issue. Change-Id: I8e616ded94310d33824242ab52e1101b7f2ddafd Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* | Merge remote-tracking branch 'origin/3.0'Katja Marttila2017-09-251-0/+171
|\| | | | | | | Change-Id: Id2e682dc2698e08f91bee83e2a94de57403545a0
| * binarycreator: Write a proper LSMinimumSystemVersion valueJake Petroules2017-08-301-0/+171
| | | | | | | | | | | | | | | | | | | | This allows macOS to display a proper error message to the user if their OS version is too old, as opposed to (probably) crashing and displaying an error dialog with a stack trace. Change-Id: I37570062d7358cc6304182182f095c9e51e16d06 Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@qt.io> Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* | Merge remote-tracking branch 'origin/3.0' into masterKatja Marttila2017-08-211-21/+24
|\| | | | | | | | | | | | | | | | | | | Conflicts: dist/config/config.xml dist/packages/org.qtproject.ifw.binaries/meta/package.xml dist/packages/org.qtproject.ifw/meta/package.xml installerfw.pri Change-Id: Ib2ab53321b599eb2e8b1e6e23be2ba507a948c5c
| * Fix syntax errorsJake Petroules2017-07-241-3/+3
| | | | | | | | | | | | | | | | Somehow a newline snuck into the wrong place, and ???? is recognized as a trigraph, which produces a warning. Change-Id: If948c544cba7ca880db4077bc3192332ce87ea52 Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@qt.io>
| * Write plists in the correct format, using v1.0 and with tabsJake Petroules2017-07-191-19/+19
| | | | | | | | | | Change-Id: I496446d95b5523087e3d15ab3ad7cba697dea361 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
| * Fix install type if --online-only passed to binarycreatorKatja Marttila2017-06-221-2/+5
| | | | | | | | | | | | | | | | | | Binarycreator assumed that install type is offline if no repositories was set although --online-only was set. However, repositories might be set later, for example in producetkeycheck::init(). Change-Id: Idd6d0e3304974773baefe3773be7e2948704575c Reviewed-by: Iikka Eklund <iikka.eklund@qt.io>
* | Merge remote-tracking branch 'origin/3.0'Katja Marttila2017-03-301-0/+1
|\| | | | | | | Change-Id: Ic3c8005de03b2cc71436aaa18486085a845dca78
| * Merge remote-tracking branch 'origin/2.0' into 3.0Katja Marttila2017-03-301-0/+1
| |\ | | | | | | | | | | | | | | | | | | Conflicts: src/libs/installer/downloadfiletask.cpp Change-Id: Ie4b07c402a63c7a12ecf24e52e197507bbb2c5df
| | * QRegExp include cleanupSamuel Gaist2017-03-131-0/+1
| | | | | | | | | | | | | | | | | | | | | This patch adds the missing include statements for QRegExp. Change-Id: I05fed3e83514af895b95a3df746b0ae1e6b31828 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
* | | Teach 'binarycreator' and 'repogen' to repack packages from repositoryKonstantin Podsvirov2017-03-131-9/+35
|/ / | | | | | | | | | | | | | | | | | | | | | | | | To both tools added options: --repository The directory containing the available repository. --ignore-invalid-repositories Ignore all invalid repositories instead of aborting. Documentation added to ifw-tools.html page. Task-number: QTIFW-925 Change-Id: I36519385df6166d0e450c0ef9d7df44c8611d6a6 Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io> Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* | Merge remote-tracking branch 'origin/2.0'Katja Marttila2017-01-301-17/+12
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: Changelog dist/config/config.xml dist/packages/org.qtproject.ifw.binaries/meta/package.xml dist/packages/org.qtproject.ifw/meta/package.xml installerfw.pri src/libs/installer/lib7z_create.h src/libs/kdtools/kdgenericfactory.cpp src/libs/kdtools/kdgenericfactory.h src/libs/kdtools/kdupdaterapplication.cpp src/libs/kdtools/kdupdaterapplication.h src/libs/kdtools/kdupdaterupdatesourcesinfo.cpp src/libs/kdtools/kdupdaterupdatesourcesinfo.h src/libs/kdtools/localpackagehub.cpp src/libs/kdtools/localpackagehub.h src/libs/kdtools/updatefinder.cpp src/libs/kdtools/updatefinder.h tools/binarycreator/resources/mkdmg.sh Change-Id: Iab2513f549832d2e750e77131c673457ab265af4
| * License header update to GPL-EXCEPTKatja Marttila2017-01-261-17/+12
| | | | | | | | | | Change-Id: I6426c4e8f932cf26c6c638dec18d0c12e22972d1 Reviewed-by: Janne Anttila <janne.anttila@theqtcompany.com>
* | Revert "Allow signing maintenancetool in Windows"Katja Marttila2016-09-151-7/+2
| | | | | | | | | | | | | | | | | | | | This reverts commit 76fd6e8f2953347ea0bf7a57b643968784bc9acc. The change caused that two installation files were needed - one executable and one dat file. Many users did not find it acceptable. We need to figure out something else. Change-Id: Ief12cd47f9897cee8a234d8611a5c18296d42b1c Reviewed-by: Iikka Eklund <iikka.eklund@qt.io>
* | Allow signing maintenancetool in WindowsKatja Marttila2016-06-211-2/+7
| | | | | | | | | | | | | | | | | | Signing was not possible for maintenancetool since metadata was added to binary. Separated metadata to installer.dat like in OS X. Task-number: QTIFW-667 Change-Id: I74ef307c51a2f43059475dd943d6f0910925fa86 Reviewed-by: Iikka Eklund <iikka.eklund@qt.io>
* | Fixed (and greatly simplified) creating .dmg filesFrerich Raabe2016-04-081-7/+20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The mkdmg.sh script which is used to create .dmg files made some effort to calculate the size of the file system contained in the .dmg file. However, it neglected to consider that a .dmg file is not always (never?) totally empty. A sample session on OS X 10.10.5 shows: $ hdiutil create /tmp/foo.dmg -megabytes 33 -ov -volname foo -type UDIF -fs HFS+ ... <a lot more dots here> created: /tmp/foo.dmg $ hdid /tmp/foo.dmg /dev/disk3 GUID_partition_scheme /dev/disk3s1 Apple_HFS /Volumes/foo $ df /Volumes/foo Filesystem 512-blocks Used Available Capacity iused ifree %iused Mounted on /dev/disk3s1 67504 1584 65920 3% 196 8240 2% /Volumes/foo About 792kB are apparently used for bookkeeping (in ".Trashes" and ".fseventsd") directories. Since mkdmg.sh failed to account for these 792kB, the .dmg file it creates was occasionally too small, causing an error message to be printed by the 'cp' command in the mkdmg.sh script (but that error message was never printed anywhere, at least I never noticed when executing binarycreator - always only when running mkdmg.sh directly). Instead of fixing the allocated size, let's just make use of the '-srcfolder' argument to 'hdiutil create' which does all of this automatically. It requires no copying around or calculating sizes, which not only makes the script much simpler, it also avoids the above-mentioned issue but also makes the script run faster: about 30% faster in my experiments. With this, the mkdmg.sh script is so small (just one hdiutil and one rm call) that we may just as well drop it completely and perform those operations straight from the C++ code. A final nice side-effect is that '-srcfolder' can be specified multiple times: this makes it very easy to copy multiple directory trees in the resulting .dmg file. This in turn is useful to create nicely styled .dmg files with custom background image and icon arrangements. Change-Id: I54d63a00e56d1ee9fa61c2690ca42d512fda37b1 Reviewed-by: Karsten Heimrich <karsten.heimrich@theqtcompany.com>
* | Add new '--sign' switch to binarycreator for signing OS X app bundlesFrerich Raabe2016-02-181-2/+46
| | | | | | | | | | | | | | | | | | | | | | | | | | This patch introduces -s/--sign switches for binarycreator which are only available on OS X. Using these switches, a 'Code Signing Identity' can be configured which should be used for signing the generated .app bundle. Signing the application bundles avoids that Apple's Gatekeeper complains about the application coming from an unidentified publisher. Change-Id: I507c6cac0b99faf19faf48c21e47a2df054b0b11 Reviewed-by: Karsten Heimrich <karsten.heimrich@theqtcompany.com>
* | Merge remote-tracking branch 'origin/2.0'Iikka Eklund2016-01-201-4/+3
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: installerfw.pri src/libs/kdtools/kdgenericfactory.cpp src/libs/kdtools/kdgenericfactory.h src/libs/kdtools/kdupdaterapplication.cpp src/libs/kdtools/kdupdaterapplication.h src/libs/kdtools/kdupdaterupdatesourcesinfo.cpp src/libs/kdtools/kdupdaterupdatesourcesinfo.h sync.profile Change-Id: Ifdc8b065f89b7e241bd3788ed79768e21888161f
| * Update license headersIikka Eklund2015-12-291-4/+3
| | | | | | | | | | | | | | | | | | Update existing license headers. LGPL -> LGPLv21. Update copyright year as well. Change-Id: Ie1d71f8c68186b8f625f409ddf94691f178093c9 Reviewed-by: Katja Marttila <katja.marttila@theqtcompany.com> Reviewed-by: Jani Heikkinen <jani.heikkinen@theqtcompany.com>
* | Fix timeout errors while building app bundles files on OS XFrerich Raabe2016-01-121-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ...by simply not using any timeout anymore. I believe this was the original intention of the code (it's arguably hideous that the default value of the waitForFinished() method is a 30000ms timeout). What happened for me is that the mkdmg.sh script took longer than 30 seconds. As a consequence 1. the 'waitForFinished()' call returned 2. The mkdgm.sh script was deleted 3. The QProcess object went out of scope, terminating the shell process 4. The binarycreator process terminated successfully The resulting .dmg file seemed plausible (it was fairly large already) but it wasn't usable yet since the hdiutil process started by mkdmg.sh was still running, i.e. the .dmg file was still growing. Hence, the caller of binarycreator (e.g. some CI system) continued processing a malformed .dmg file (and the temporary file created by mkdmg.sh never got deleted). Last but not least, proper error handling would have been nice of course but I considered that to be out of scope for this particular commit. Change-Id: I767ff89d20802306189660804cea617c148a943e Reviewed-by: Karsten Heimrich <karsten.heimrich@theqtcompany.com> Reviewed-by: Katja Marttila <katja.marttila@theqtcompany.com>
* | Sanitize QDebug outputKai Koehne2015-07-091-3/+2
| | | | | | | | | | | | | | | | | | | | | | | | Prefer using the stream operator logic instead of using QString::fromLatin1. Add a noquote() where a QString should be printed without any quotes/escapes. This also fixes the tests with Qt 5.5, where QString's are further escaped. Change-Id: Ie3afd14b9355101d3c0b52f30f66ec759c76526c Reviewed-by: Karsten Heimrich <karsten.heimrich@theqtcompany.com>
* | Unify translated error messagesKai Koehne2015-06-241-8/+8
|/ | | | | | | | | | | | * Enclose file paths in "" * Localize file paths with QDir::toNativeSeparators. * Make sure sentences end with a '.' * Append error details always by ':', e.g. tr("Failed to copy file '%1': %2").(...) * Use 'directory' instead of 'folder' everywhere Change-Id: Ie045f429f72ad5045c96537465c5fb9d2e99d250 Reviewed-by: Karsten Heimrich <karsten.heimrich@theqtcompany.com>
* Update CopyrightKai Koehne2015-02-181-7/+7
| | | | | Change-Id: I8dde6629cfd461104364d5cdc255cb54b58283fa Reviewed-by: Niels Weber <niels.weber@theqtcompany.com>
* no longer use Version as the repository format versionChristoph Vogtländer2015-01-201-1/+1
| | | | | | | | | | | | Use the Version value defined in config.xml as the product version exclusively instead of sometimes using it as the repository format version in components.xml (which must be 1.0.0) and sometimes as the product version. Change-Id: I63864947bf131ac6e246a2aaf6febdda0555c13d Reviewed-by: Leena Miettinen <riitta-leena.miettinen@theqtcompany.com> Reviewed-by: Niels Weber <niels.weber@theqtcompany.com> Reviewed-by: Kai Koehne <kai.koehne@theqtcompany.com>
* Small cosmetical changes, no functional.karsten.heimrich@theqtcompany.com2014-11-211-1/+1
| | | | | Change-Id: Ic984503444187dfcfcfa83f82768bebb329381d0 Reviewed-by: Niels Weber <niels.weber@theqtcompany.com>
* Fix generation of Updates.xmlChristoph Vogtländer2014-11-181-8/+14
| | | | | | | | | | | Generated Updates.xml was missing DownloadableArchives property and component size was not calculated properly in case package directory contains files that are packaged into 7zip archives by the installer. Change-Id: I73e3d16b73cfbe25cb8b2e55b9c93f48b1ecdb1c Reviewed-by: Niels Weber <niels.weber@theqtcompany.com> Reviewed-by: Kai Koehne <kai.koehne@theqtcompany.com> Reviewed-by: Karsten Heimrich <karsten.heimrich@theqtcompany.com>
* Fix compilation on OSX and WindowsNiels Weber2014-11-141-6/+1
| | | | | Change-Id: I2981cdebda3fba7d69269ae6b1a1ae7999162fa6 Reviewed-by: Christian Stenger <christian.stenger@theqtcompany.com>
* Allow to check for IFW version in codeKai Koehne2014-11-111-1/+1
| | | | | | | | | | Rename the IFW_VERSION to IFW_VERSION_STR, and add a new IFW_VERSION define that encodes the version in hex. This follows the pattern of QT_VERSION and QT_VERSION_STR, and allows easy checking of the IFW version e.g. in macros. Change-Id: I232c8aa53c9a04522810208cdd1ac595d8676879 Reviewed-by: Karsten Heimrich <karsten.heimrich@theqtcompany.com>
* Fix the steps we perform to build an installer.kh12014-11-051-11/+21
| | | | | | | | | | | We need to keep a specific order, otherwise the data might endup in the resource file as well and gets appended twice to the installer binary. Task-number: QTIFW-564 Change-Id: Idcadb5d65043d1855846556b63191898a4a54027 Reviewed-by: Christoph Vogtländer <c.vogtlaender@sigma-surface-science.com> Reviewed-by: Niels Weber <niels.weber@digia.com>
* Add LGPLv3 as new licenseKai Koehne2014-10-161-14/+7
| | | | | | | Change-Id: I61158f956894e209dccf83744b4753774676099d Reviewed-by: Karsten Heimrich <karsten.heimrich@digia.com> Reviewed-by: Niels Weber <niels.weber@digia.com> Reviewed-by: Maurice Kalinowski <maurice.kalinowski@digia.com>
* Overhaul the binary format API.kh12014-10-151-22/+27
| | | | | | | | | | | | | | Adjust some naming. Add documentation. Make the Resource class handle files only, this is sufficient to read and map inbuild resources. Keep the QResources inside the manager as well, no need to handle them separate. Remove read, write functions from collection class, the API was just unclear how to use. Still it is far from intuitive in the manager class either. If we open a Resource, we need to close it on our own case they are pointers. Change-Id: Ic8aa32a84a15ac774fe1194ba0dbb5733f7216d6 Reviewed-by: Leena Miettinen <riitta-leena.miettinen@digia.com> Reviewed-by: Kai Koehne <kai.koehne@theqtcompany.com>
* Make use of the new binary content write function.kh12014-08-271-90/+53
| | | | | Change-Id: Icd6e8a77458e61adc92d93e49846b63a79082513 Reviewed-by: Niels Weber <niels.weber@digia.com>
* Rename binary format classes and functions. Move to QInstaller.kh12014-08-271-22/+16
| | | | | | | | | | Adjust some minor implementation details. Some renaming of member variables and function names is left out but will follow in later patches. Add some documentation. Change-Id: I929dcbe13fa701be5224b9e5fdf8d19bfff81235 Reviewed-by: Kai Koehne <kai.koehne@digia.com> Reviewed-by: Niels Weber <niels.weber@digia.com>
* Update documentation and rename code to improve readability.kh12014-07-151-8/+10
| | | | | Change-Id: I5b467aca314f81304f7a4854cb6ea5b4f57361f3 Reviewed-by: Kai Koehne <kai.koehne@digia.com>
* Make the marker and the find function class members.kh12014-07-151-2/+2
| | | | | | | Prepare for QTIFW-292 and QTIFW-345. Change-Id: I065366742d28e72bc5ae55e70eabf6532b809fea Reviewed-by: Karsten Heimrich <karsten.heimrich@digia.com>
* Move class BinaryContent into its own file.kh12014-07-151-1/+2
| | | | | | | Prepare for QTIFW-292 and QTIFW-345. Change-Id: I938b5aa728e8f81eb9521df5753ad80ac630d96e Reviewed-by: Karsten Heimrich <karsten.heimrich@digia.com>
* Workaround for QFileInfo::isBundle().kh12014-07-041-1/+1
| | | | | | | | | | | | | | | For some reason the former code did not work anyore as expected, the issue seems to be in QFileInfo::isBundle or how we used it. To not depend on a possible fix in Qt, we now always resolve the path before we ask QFileInfo if it is a bundle. Fixes also the behavior change introduced in cead4555. On OSX, we get the .dat file passed that's inside the bundle, still we need to read the data from a .dat file that's located beside the app bundle... Change-Id: Idaa7adc6fbad6bd8e9ce90c383b34ea51fe40e8f Reviewed-by: Kai Koehne <kai.koehne@digia.com>
* Replace Q_OS_MAC with Q_OS_OSXNiels Weber2014-07-031-7/+7
| | | | | | | | Q_OS_MAC also refers to iOS. Change-Id: I91603d0add90a0f3948453a6b9628814b0d9f80c Reviewed-by: Jarek Kobus <jaroslaw.kobus@digia.com> Reviewed-by: Karsten Heimrich <karsten.heimrich@digia.com>
* Fix broken tools after switching to QFileDevice.kh12014-07-021-15/+23
| | | | | | | | | | | Follow up on 924ebcdbc9b9e590a5f0905941e2d05ac34d4be2 (Part 1). Get rid of KDSaveFile, reuse QTemporaryFile. After changing KDSaveFile to inherit from QFileDevice, it turns out to be not working properly anymore and crashing e.g. binarycreator while using it. To save fixing it we just switch to QTemporaryFile. Change-Id: I785a04db91b431f5e122f193ecf2ef3c54e34b1c Reviewed-by: Kai Koehne <kai.koehne@digia.com>
* Split out the file IO stuff and adjust other files respectively.kh12014-06-241-19/+20
| | | | | | | | | Also adjust the API to use QFileDevice instead of QIODevice to make clear we just operate on files here and not on any possible device like sockets, processes etc... Change-Id: I4ecbb6e244fe4bb666ed12e62f9f5586bc1347f0 Reviewed-by: Kai Koehne <kai.koehne@digia.com>
* Use QTemporaryDir instead of our homemade solution.kh12014-06-031-1/+4
| | | | | | Change-Id: Ia584a9b2f954df5c29a2f0aa5f12b201b2bfbcc4 Reviewed-by: Niels Weber <niels.weber@digia.com> Reviewed-by: Tim Jenssen <tim.jenssen@digia.com>
* Name .dmg files after the application bundle on Mac OS XSascha Cunz2013-11-081-1/+1
| | | | | | | | | Use the name of the application bundle (input.outputPath) to give the disc image a volume name instead of using the file name of the .dat file ("out" is set to 'installer.dat' at construction time). Change-Id: I0f53ca7fcafb83353f4fea61b62037f48281375e Reviewed-by: Karsten Heimrich <karsten.heimrich@digia.com>