summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorkh1 <karsten.heimrich@digia.com>2013-01-31 15:37:13 +0100
committerKarsten Heimrich <karsten.heimrich@digia.com>2013-02-04 12:35:40 +0100
commitaff8a9920257d25d6f2651c909ce277ddbd75c59 (patch)
tree618dedded0234668f7947c259578a6f44b895742 /src
parent60223eba3ee71ec9347b9ad2259759f892386088 (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')
-rw-r--r--src/libs/installer/fileutils.cpp46
-rw-r--r--src/libs/installer/fileutils.h8
-rw-r--r--src/libs/installer/packagemanagercoredata.cpp22
3 files changed, 69 insertions, 7 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)
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 <QDir>
@@ -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);