From aff8a9920257d25d6f2651c909ce277ddbd75c59 Mon Sep 17 00:00:00 2001 From: kh1 Date: Thu, 31 Jan 2013 15:37:13 +0100 Subject: "Normalize" installation path on Windows installer. Task-number: QTIFW-175 Change-Id: I10ecc5830ff80f00a2aa67a2d9b66d9e37ac8ef0 Reviewed-by: Niels Weber Reviewed-by: Kai Koehne --- src/libs/installer/fileutils.cpp | 46 +++++++++++++++++++++++++++ src/libs/installer/fileutils.h | 8 +++++ src/libs/installer/packagemanagercoredata.cpp | 22 +++++++++---- 3 files changed, 69 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/libs/installer/fileutils.cpp b/src/libs/installer/fileutils.cpp index 9c8e9e50b..3e87129b2 100644 --- a/src/libs/installer/fileutils.cpp +++ b/src/libs/installer/fileutils.cpp @@ -462,6 +462,52 @@ QString QInstaller::createTemporaryDirectory(const QString &templ) #ifdef Q_OS_WIN #include +QString QInstaller::getShortPathName(const QString &name) +{ + if (name.isEmpty()) + return name; + + // Determine length, then convert. + const LPCTSTR nameC = reinterpret_cast(name.utf16()); // MinGW + const DWORD length = GetShortPathName(nameC, NULL, 0); + if (length == 0) + return name; + QScopedArrayPointer buffer(new TCHAR[length]); + GetShortPathName(nameC, buffer.data(), length); + const QString rc = QString::fromUtf16(reinterpret_cast(buffer.data()), length - 1); + return rc; +} + +QString QInstaller::getLongPathName(const QString &name) +{ + if (name.isEmpty()) + return name; + + // Determine length, then convert. + const LPCTSTR nameC = reinterpret_cast(name.utf16()); // MinGW + const DWORD length = GetLongPathName(nameC, NULL, 0); + if (length == 0) + return name; + QScopedArrayPointer buffer(new TCHAR[length]); + GetLongPathName(nameC, buffer.data(), length); + const QString rc = QString::fromUtf16(reinterpret_cast(buffer.data()), length - 1); + return rc; +} + +QString QInstaller::normalizePathName(const QString &name) +{ + QString canonicalName = getShortPathName(name); + if (canonicalName.isEmpty()) + return name; + canonicalName = getLongPathName(canonicalName); + if (canonicalName.isEmpty()) + return name; + // Upper case drive letter + if (canonicalName.size() > 2 && canonicalName.at(1) == QLatin1Char(':')) + canonicalName[0] = canonicalName.at(0).toUpper(); + return canonicalName; +} + #pragma pack(push) #pragma pack(2) diff --git a/src/libs/installer/fileutils.h b/src/libs/installer/fileutils.h index 021e5ee3e..79619a670 100644 --- a/src/libs/installer/fileutils.h +++ b/src/libs/installer/fileutils.h @@ -121,6 +121,14 @@ private: void INSTALLER_EXPORT mkpath(const QString &path); #ifdef Q_OS_WIN + QString INSTALLER_EXPORT getLongPathName(const QString &name); + QString INSTALLER_EXPORT getShortPathName(const QString &name); + + /*! + Makes sure that capitalization of directories is canonical. + */ + QString INSTALLER_EXPORT normalizePathName(const QString &name); + /*! Sets the .ico file at \a icon as application icon for \a application. */ diff --git a/src/libs/installer/packagemanagercoredata.cpp b/src/libs/installer/packagemanagercoredata.cpp index e6cc6ebdd..9b7424375 100644 --- a/src/libs/installer/packagemanagercoredata.cpp +++ b/src/libs/installer/packagemanagercoredata.cpp @@ -41,6 +41,7 @@ #include "packagemanagercoredata.h" #include "errors.h" +#include "fileutils.h" #include "qsettingswrapper.h" #include @@ -132,6 +133,19 @@ bool PackageManagerCoreData::setValue(const QString &key, const QString &normali QVariant PackageManagerCoreData::value(const QString &key, const QVariant &_default) const { + if (key == scTargetDir) { + QString dir = m_variables.value(key); + if (dir.isEmpty()) + dir = m_settings.value(key, _default).toString(); +#ifdef Q_OS_WIN + return QInstaller::normalizePathName(dir); +#else + if (dir.startsWith(QLatin1String("~/"))) + return QDir::home().absoluteFilePath(dir.mid(2)); + return dir; +#endif + } + #ifdef Q_OS_WIN if (!m_variables.contains(key)) { static const QRegExp regex(QLatin1String("\\\\|/")); @@ -141,14 +155,8 @@ QVariant PackageManagerCoreData::value(const QString &key, const QVariant &_defa if (!filename.isEmpty() && !regKey.isEmpty() && registry.contains(regKey)) return registry.value(regKey).toString(); } -#else - if (key == scTargetDir) { - const QString dir = m_variables.value(key, _default.toString()); - if (dir.startsWith(QLatin1String("~/"))) - return QDir::home().absoluteFilePath(dir.mid(2)); - return dir; - } #endif + if (m_variables.contains(key)) return m_variables.value(key); -- cgit v1.2.3