From b55c10f189f5034bfbe63e8df3195ab9fb81725e Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 11 Nov 2022 12:50:59 +0100 Subject: [PATCH] Squish: Fix object map handling on Windows Ensure we are using UTF8 all over the place especially when using external tools and their stdin or stdout streams. This fixes bad encoding issues on Windows when having unicode characters inside the objects map file. Change-Id: Ic8e66a876abe0903308002cd25315b1eaa3788b1 Reviewed-by: David Schulz --- src/plugins/squish/objectsmapdocument.cpp | 11 ++++++----- src/plugins/squish/objectsmapeditorwidget.cpp | 2 +- src/plugins/squish/objectsmaptreeitem.cpp | 15 ++++++++------- src/plugins/squish/squish.qbs | 1 + 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/plugins/squish/objectsmapdocument.cpp b/src/plugins/squish/objectsmapdocument.cpp index 32d0804efa2..0d277900d6b 100644 --- a/src/plugins/squish/objectsmapdocument.cpp +++ b/src/plugins/squish/objectsmapdocument.cpp @@ -12,7 +12,7 @@ #include #include -#include +#include namespace Squish { namespace Internal { @@ -187,13 +187,13 @@ Core::IDocument::OpenResult ObjectsMapDocument::openImpl(QString *error, if (fileName.isEmpty()) return OpenResult::CannotHandle; - QString text; + QByteArray text; if (realFileName.fileName() == "objects.map") { Utils::FileReader reader; if (!reader.fetch(realFileName, QIODevice::Text, error)) return OpenResult::ReadError; - text = QString::fromLocal8Bit(reader.data()); + text = reader.data(); } else { const Utils::FilePath base = SquishPlugin::squishSettings()->squishPath.filePath(); if (base.isEmpty()) { @@ -212,11 +212,12 @@ Core::IDocument::OpenResult ObjectsMapDocument::openImpl(QString *error, Utils::QtcProcess objectMapReader; objectMapReader.setCommand({exe, {"--scriptMap", "--mode", "read", "--scriptedObjectMapPath", realFileName.toUserOutput()}}); + objectMapReader.setCodec(QTextCodec::codecForName("UTF-8")); objectMapReader.start(); objectMapReader.waitForFinished(); - text = objectMapReader.cleanedStdOut(); + text = objectMapReader.cleanedStdOut().toUtf8(); } - if (!setContents(text.toUtf8())) { + if (!setContents(text)) { if (error) error->append(Tr::tr("Failure while parsing objects.map content.")); return OpenResult::ReadError; diff --git a/src/plugins/squish/objectsmapeditorwidget.cpp b/src/plugins/squish/objectsmapeditorwidget.cpp index dd981124b91..50f92e46242 100644 --- a/src/plugins/squish/objectsmapeditorwidget.cpp +++ b/src/plugins/squish/objectsmapeditorwidget.cpp @@ -346,7 +346,7 @@ void ObjectsMapEditorWidget::onPropertiesContentModified(const QString &text) const QModelIndex &idx = m_objMapFilterModel->mapToSource(selected.first()); if (auto item = static_cast(m_document->model()->itemForIndex(idx))) - item->setPropertiesContent(text.toLocal8Bit().trimmed()); + item->setPropertiesContent(text.toUtf8().trimmed()); } void ObjectsMapEditorWidget::onJumpToSymbolicNameClicked() diff --git a/src/plugins/squish/objectsmaptreeitem.cpp b/src/plugins/squish/objectsmaptreeitem.cpp index 4338181be3b..79c0c27eaea 100644 --- a/src/plugins/squish/objectsmaptreeitem.cpp +++ b/src/plugins/squish/objectsmaptreeitem.cpp @@ -130,19 +130,20 @@ bool ObjectsMapTreeItem::parseProperties(const QByteArray &properties) if (properties.isEmpty() || properties.at(0) != '{') return false; + QString p = QString::fromUtf8(properties); ParseState state = None; - QByteArray name; - QByteArray value; - QByteArray oper; + QString name; + QString value; + QString oper; bool masquerading = false; - for (char c : properties) { + for (QChar c : p) { if (masquerading) { value.append('\\').append(c); masquerading = false; continue; } - switch (c) { + switch (c.unicode()) { case '=': if (state == Value) { value.append(c); @@ -172,7 +173,7 @@ bool ObjectsMapTreeItem::parseProperties(const QByteArray &properties) } else if (state == Value) { state = None; Property prop; - if (!prop.set(QLatin1String(name), QLatin1String(oper), QLatin1String(value))) { + if (!prop.set(name, oper, value)) { propertyRoot->removeChildren(); return false; } @@ -214,7 +215,7 @@ bool ObjectsMapTreeItem::parseProperties(const QByteArray &properties) } break; default: - if (QChar::isSpace(c)) { + if (c.isSpace()) { if (state == Value) { value.append(c); } else if (state == Name) { diff --git a/src/plugins/squish/squish.qbs b/src/plugins/squish/squish.qbs index c0026e7e562..4c74c6466fc 100644 --- a/src/plugins/squish/squish.qbs +++ b/src/plugins/squish/squish.qbs @@ -10,6 +10,7 @@ QtcPlugin { Depends { name: "Utils" } Depends { name: "Qt.widgets" } + Depends { name: "Qt.core5compat" } files: [ "deletesymbolicnamedialog.cpp",