From 9d7cff74d94e3a9ee2beaccfa5aa6a15a93585cb Mon Sep 17 00:00:00 2001 From: Katja Marttila Date: Fri, 28 Sep 2018 13:07:47 +0300 Subject: 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 --- src/libs/installer/packagemanagercore_p.cpp | 72 ++++++++++++++++------------- 1 file 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]); -- cgit v1.2.3