diff options
author | kh1 <karsten.heimrich@digia.com> | 2013-01-31 15:37:13 +0100 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@digia.com> | 2013-02-04 12:35:40 +0100 |
commit | aff8a9920257d25d6f2651c909ce277ddbd75c59 (patch) | |
tree | 618dedded0234668f7947c259578a6f44b895742 /src/libs/installer/fileutils.cpp | |
parent | 60223eba3ee71ec9347b9ad2259759f892386088 (diff) |
"Normalize" installation path on Windows installer.
Task-number: QTIFW-175
Change-Id: I10ecc5830ff80f00a2aa67a2d9b66d9e37ac8ef0
Reviewed-by: Niels Weber <niels.weber@digia.com>
Reviewed-by: Kai Koehne <kai.koehne@digia.com>
Diffstat (limited to 'src/libs/installer/fileutils.cpp')
-rw-r--r-- | src/libs/installer/fileutils.cpp | 46 |
1 files changed, 46 insertions, 0 deletions
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 <windows.h> +QString QInstaller::getShortPathName(const QString &name) +{ + if (name.isEmpty()) + return name; + + // Determine length, then convert. + const LPCTSTR nameC = reinterpret_cast<LPCTSTR>(name.utf16()); // MinGW + const DWORD length = GetShortPathName(nameC, NULL, 0); + if (length == 0) + return name; + QScopedArrayPointer<TCHAR> buffer(new TCHAR[length]); + GetShortPathName(nameC, buffer.data(), length); + const QString rc = QString::fromUtf16(reinterpret_cast<const ushort *>(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<LPCTSTR>(name.utf16()); // MinGW + const DWORD length = GetLongPathName(nameC, NULL, 0); + if (length == 0) + return name; + QScopedArrayPointer<TCHAR> buffer(new TCHAR[length]); + GetLongPathName(nameC, buffer.data(), length); + const QString rc = QString::fromUtf16(reinterpret_cast<const ushort *>(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) |