summaryrefslogtreecommitdiffstats
path: root/src/libs/installer/fileutils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/installer/fileutils.cpp')
-rw-r--r--src/libs/installer/fileutils.cpp46
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)