summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKai Koehne <kai.koehne@nokia.com>2010-12-21 12:39:14 +0100
committerKai Koehne <kai.koehne@nokia.com>2010-12-21 13:13:16 +0100
commite414335f26986d8786a6a158e5b9c6c1bd489de0 (patch)
tree6a4fd3f763404818fbfc6c99ebf172798ee54cef /src
parent550a85a432cc03915c1ae5f90ec53010b6e03c5b (diff)
downloadqt-creator-e414335f26986d8786a6a158e5b9c6c1bd489de0.tar.gz
Fix capitalization problems with qmlviewer
qmlviewer is picky about file path capitalization, and will bail out with 'File name case mismatch' if e.g. the working directory is wrongly capitalized. Prevent this by computing the canonical path of the qml file + working directory in advance. Reviewed-by: Alessandro Portale Task-number: QTCREATORBUG-3417
Diffstat (limited to 'src')
-rw-r--r--src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp38
-rw-r--r--src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h2
2 files changed, 37 insertions, 3 deletions
diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp
index 311947a44b..9f5a4687f9 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp
@@ -45,6 +45,10 @@
#include <qt4projectmanager/qtoutputformatter.h>
#include <qt4projectmanager/qt4projectmanagerconstants.h>
+#ifdef Q_OS_WIN32
+#include <Windows.h>
+#endif
+
using Core::EditorManager;
using Core::ICore;
using Core::IEditor;
@@ -144,16 +148,18 @@ QString QmlProjectRunConfiguration::viewerArguments() const
Utils::QtcProcess::addArg(&args, importPath);
}
- const QString &s = mainScript();
- if (!s.isEmpty())
+ QString s = mainScript();
+ if (!s.isEmpty()) {
+ s = canonicalCapsPath(s);
Utils::QtcProcess::addArg(&args, s);
+ }
return args;
}
QString QmlProjectRunConfiguration::workingDirectory() const
{
QFileInfo projectFile(qmlTarget()->qmlProject()->file()->fileName());
- return projectFile.absolutePath();
+ return canonicalCapsPath(projectFile.absolutePath());
}
int QmlProjectRunConfiguration::qtVersionId() const
@@ -172,6 +178,32 @@ void QmlProjectRunConfiguration::setQtVersionId(int id)
m_configurationWidget.data()->updateQtVersionComboBox();
}
+/* QtDeclarative checks explicitly that the capitalization for any URL / path
+ is exactly like the capitalization on disk. This method is uses the same
+ native Windows API's to get the exact canonical path. */
+QString QmlProjectRunConfiguration::canonicalCapsPath(const QString &fileName)
+{
+ QString canonicalPath = QFileInfo(fileName).canonicalFilePath();
+
+#if defined(Q_OS_WIN32)
+ wchar_t *buffer = 0;
+ do {
+ long length = ::GetLongPathName((wchar_t*)fileName.utf16(), NULL, 0);
+ if (!length)
+ break;
+ buffer = new wchar_t[length];
+ DWORD rv = ::GetLongPathName((wchar_t*)fileName.utf16(), buffer, length);
+ if (!rv)
+ break;
+ canonicalPath = QString((QChar*)buffer);
+ } while (false);
+ delete buffer;
+#endif
+
+ return canonicalPath;
+}
+
+
Qt4ProjectManager::QtVersion *QmlProjectRunConfiguration::qtVersion() const
{
if (m_qtVersionId == -1)
diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h
index bd5b13b274..d5ebdbf6c2 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h
+++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h
@@ -120,6 +120,8 @@ private:
void ctor();
static bool isValidVersion(Qt4ProjectManager::QtVersion *version);
void setQtVersionId(int id);
+
+ static QString canonicalCapsPath(const QString &filePath);
Utils::Environment baseEnvironment() const;
void setUserEnvironmentChanges(const QList<Utils::EnvironmentItem> &diff);