diff options
author | Katja Marttila <katja.marttila@qt.io> | 2018-09-28 13:07:47 +0300 |
---|---|---|
committer | Katja Marttila <katja.marttila@qt.io> | 2018-10-04 06:40:52 +0000 |
commit | 9d7cff74d94e3a9ee2beaccfa5aa6a15a93585cb (patch) | |
tree | e43fcff6a48ec46c4cd2158cdf626ff591e99d60 | |
parent | 0fce30623629077584a9cf28f3b93225f3f05a48 (diff) |
Fix maintenancetool writing in Windows
In Windows, maintenancetool is written using vb script. Installer
assumed that extension .vbs is always executed with script engine which
is not always true. In such cases create own extension (.qtInstaller)
which can be run with script engine
Task-number: QTIFW-1096
Change-Id: Ic52427e778fc7f3a540256e16b9e67b728c70d41
Reviewed-by: Karsten Heimrich <karsten.heimrich@qt.io>
-rw-r--r-- | src/libs/installer/packagemanagercore_p.cpp | 72 |
1 files changed, 41 insertions, 31 deletions
diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp index 78482b411..c20be0b78 100644 --- a/src/libs/installer/packagemanagercore_p.cpp +++ b/src/libs/installer/packagemanagercore_p.cpp @@ -141,39 +141,49 @@ static void deferredRename(const QString &oldName, const QString &newName, bool { #ifdef Q_OS_WIN QStringList arguments; - { - QTemporaryFile f(QDir::temp().absoluteFilePath(QLatin1String("deferredrenameXXXXXX.vbs"))); - QInstaller::openForWrite(&f); - f.setAutoRemove(false); - - arguments << QDir::toNativeSeparators(f.fileName()) << QDir::toNativeSeparators(oldName) - << QDir::toNativeSeparators(QFileInfo(oldName).dir().absoluteFilePath(QFileInfo(newName) - .fileName())); - - QTextStream batch(&f); - batch.setCodec("UTF-16"); - batch << "Set fso = WScript.CreateObject(\"Scripting.FileSystemObject\")\n"; - batch << "Set tmp = WScript.CreateObject(\"WScript.Shell\")\n"; - batch << QString::fromLatin1("file = \"%1\"\n").arg(arguments[2]); - batch << "on error resume next\n"; - - batch << "while fso.FileExists(file)\n"; - batch << " fso.DeleteFile(file)\n"; - batch << " WScript.Sleep(1000)\n"; - batch << "wend\n"; - batch << QString::fromLatin1("fso.MoveFile \"%1\", file\n").arg(arguments[1]); - if (restart) { - //Restart with same command line arguments as first executable - QStringList commandLineArguments = QCoreApplication::arguments(); - batch << QString::fromLatin1("tmp.exec \"%1 --updater").arg(arguments[2]); - //Skip the first argument as that is executable itself - for (int i = 1; i < commandLineArguments.count(); i++) { - batch << QString::fromLatin1(" %1").arg(commandLineArguments.at(i)); - } - batch << QString::fromLatin1("\"\n"); + + // Check if .vbs extension can be used for running renaming script. If not, create own extension + QString extension = QLatin1String(".vbs"); + QSettingsWrapper settingRoot(QLatin1String("HKEY_CLASSES_ROOT\\.vbs"), QSettingsWrapper::NativeFormat); + if (settingRoot.value(QLatin1String(".")).toString() != QLatin1String("VBSFile")) { + extension = QLatin1String(".qtInstaller"); + QSettingsWrapper settingsUser(QLatin1String("HKEY_CURRENT_USER\\Software\\Classes"), QSettingsWrapper::NativeFormat); + QString value = settingsUser.value(extension).toString(); + if (value != QLatin1String("VBSFile")) + settingsUser.setValue(extension, QLatin1String("VBSFile")); + } + QTemporaryFile f(QDir::temp().absoluteFilePath(QLatin1String("deferredrenameXXXXXX%1")).arg(extension)); + + QInstaller::openForWrite(&f); + f.setAutoRemove(false); + + arguments << QDir::toNativeSeparators(f.fileName()) << QDir::toNativeSeparators(oldName) + << QDir::toNativeSeparators(QFileInfo(oldName).dir().absoluteFilePath(QFileInfo(newName) + .fileName())); + + QTextStream batch(&f); + batch.setCodec("UTF-16"); + batch << "Set fso = WScript.CreateObject(\"Scripting.FileSystemObject\")\n"; + batch << "Set tmp = WScript.CreateObject(\"WScript.Shell\")\n"; + batch << QString::fromLatin1("file = \"%1\"\n").arg(arguments[2]); + batch << "on error resume next\n"; + + batch << "while fso.FileExists(file)\n"; + batch << " fso.DeleteFile(file)\n"; + batch << " WScript.Sleep(1000)\n"; + batch << "wend\n"; + batch << QString::fromLatin1("fso.MoveFile \"%1\", file\n").arg(arguments[1]); + if (restart) { + //Restart with same command line arguments as first executable + QStringList commandLineArguments = QCoreApplication::arguments(); + batch << QString::fromLatin1("tmp.exec \"%1 --updater").arg(arguments[2]); + //Skip the first argument as that is executable itself + for (int i = 1; i < commandLineArguments.count(); i++) { + batch << QString::fromLatin1(" %1").arg(commandLineArguments.at(i)); } - batch << "fso.DeleteFile(WScript.ScriptFullName)\n"; + batch << QString::fromLatin1("\"\n"); } + batch << "fso.DeleteFile(WScript.ScriptFullName)\n"; QProcessWrapper::startDetached(QLatin1String("cscript"), QStringList() << QLatin1String("//Nologo") << arguments[0]); |