mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-10-03 01:04:13 +02:00
Read symbol files through QFile so paths past 260 characters work on Windows
ElementsLocation::pugiXml() and the qet_directory name lookup opened files with pugixml's load_file(), which on Windows fails once the full path reaches MAX_PATH. QFile handles long paths, so exist() and the import succeeded while uuid(), the name, the informations and the thumbnail of the same symbol came back empty. Read the bytes with QFile and hand them to load_buffer(). Reported on #1178 as a false collision from qet.addElement. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -709,12 +709,20 @@ pugi::xml_document ElementsLocation::pugiXml() const
|
||||
#endif
|
||||
if (!m_project)
|
||||
{
|
||||
//Read through QFile, not pugi's load_file(): on Windows load_file()
|
||||
//fails once the full path reaches MAX_PATH (260 characters), while
|
||||
//QFile handles long paths.
|
||||
QFile file(m_file_system_path);
|
||||
if (!file.open(QIODevice::ReadOnly)) {
|
||||
return docu;
|
||||
}
|
||||
const QByteArray data = file.readAll();
|
||||
#ifndef Q_OS_LINUX
|
||||
if (docu.load_file(m_file_system_path.toStdWString().c_str())) {
|
||||
if (docu.load_buffer(data.constData(), data.size())) {
|
||||
docu.save(m_string_stream);
|
||||
}
|
||||
#else
|
||||
docu.load_file(m_file_system_path.toStdWString().c_str());
|
||||
docu.load_buffer(data.constData(), data.size());
|
||||
#endif
|
||||
}
|
||||
else
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
|
||||
#include <QApplication>
|
||||
#include <QDir>
|
||||
#include <QFile>
|
||||
#include <QPainter>
|
||||
#include <QPixmap>
|
||||
#include <QStyle>
|
||||
@@ -178,7 +179,12 @@ QString FileElementCollectionItem::localName()
|
||||
bool readable = false;
|
||||
QString str(fileSystemPath() % "/qet_directory");
|
||||
pugi::xml_document docu;
|
||||
if (docu.load_file(str.toStdWString().c_str()))
|
||||
// QFile rather than pugi's load_file(), which fails on
|
||||
// Windows once the full path reaches 260 characters.
|
||||
QFile file(str);
|
||||
const QByteArray data = file.open(QIODevice::ReadOnly)
|
||||
? file.readAll() : QByteArray();
|
||||
if (!data.isEmpty() && docu.load_buffer(data.constData(), data.size()))
|
||||
{
|
||||
if (QString(docu.document_element().name())
|
||||
== "qet-directory")
|
||||
|
||||
Reference in New Issue
Block a user