Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qresourcerelocater.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
5
6#include <QXmlStreamReader>
7#include <QFile>
8#include <QDir>
9
11
18{
19 enum State {
20 InitialState,
21 InRCC,
22 InResource,
23 InFile
24 };
25 State state = InitialState;
26
27 QString prefix;
28 QString currentFileName;
29 QXmlStreamAttributes fileAttributes;
30
33 fprintf(stderr, "Cannot open %s for reading.\n", qPrintable(input));
34 return EXIT_FAILURE;
35 }
36
37 QDir inputDirectory = QFileInfo(file).absoluteDir();
38 QDir outputDirectory = QFileInfo(output).absoluteDir();
39
40 QString outputString;
41 QXmlStreamWriter writer(&outputString);
42 writer.setAutoFormatting(true);
43
44 QXmlStreamReader reader(&file);
45 while (!reader.atEnd()) {
46 switch (reader.readNext()) {
47 case QXmlStreamReader::StartDocument: {
48 QStringView version = reader.documentVersion();
49 if (!version.isEmpty())
50 writer.writeStartDocument(version.toString());
51 else
52 writer.writeStartDocument();
53 break;
54 }
55 case QXmlStreamReader::EndDocument:
56 writer.writeEndDocument();
57 break;
58 case QXmlStreamReader::StartElement:
59 if (reader.name() == QStringLiteral("RCC")) {
60 if (state != InitialState) {
61 fprintf(stderr, "Unexpected RCC tag in line %d\n", int(reader.lineNumber()));
62 return EXIT_FAILURE;
63 }
64 state = InRCC;
65 } else if (reader.name() == QStringLiteral("qresource")) {
66 if (state != InRCC) {
67 fprintf(stderr, "Unexpected qresource tag in line %d\n", int(reader.lineNumber()));
68 return EXIT_FAILURE;
69 }
70 state = InResource;
71 QXmlStreamAttributes attributes = reader.attributes();
72 if (attributes.hasAttribute(QStringLiteral("prefix")))
73 prefix = attributes.value(QStringLiteral("prefix")).toString();
74 if (!prefix.startsWith(QLatin1Char('/')))
75 prefix.prepend(QLatin1Char('/'));
76 if (!prefix.endsWith(QLatin1Char('/')))
77 prefix.append(QLatin1Char('/'));
78 } else if (reader.name() == QStringLiteral("file")) {
79 if (state != InResource) {
80 fprintf(stderr, "Unexpected file tag in line %d\n", int(reader.lineNumber()));
81 return EXIT_FAILURE;
82 }
83 state = InFile;
84 fileAttributes = reader.attributes();
85 continue;
86 }
87 writer.writeStartElement(reader.name().toString());
88 writer.writeAttributes(reader.attributes());
89 continue;
90
91 case QXmlStreamReader::EndElement:
92 if (reader.name() == QStringLiteral("file")) {
93 if (state != InFile) {
94 fprintf(stderr, "Unexpected end of file tag in line %d\n", int(reader.lineNumber()));
95 return EXIT_FAILURE;
96 }
97 state = InResource;
98 continue;
99 } else if (reader.name() == QStringLiteral("qresource")) {
100 if (state != InResource) {
101 fprintf(stderr, "Unexpected end of qresource tag in line %d\n", int(reader.lineNumber()));
102 return EXIT_FAILURE;
103 }
104 state = InRCC;
105 } else if (reader.name() == QStringLiteral("RCC")) {
106 if (state != InRCC) {
107 fprintf(stderr, "Unexpected end of RCC tag in line %d\n", int(reader.lineNumber()));
108 return EXIT_FAILURE;
109 }
110 state = InitialState;
111 }
112 writer.writeEndElement();
113 continue;
114
115 case QXmlStreamReader::Characters:
116 if (reader.isWhitespace())
117 break;
118 if (state != InFile)
119 return EXIT_FAILURE;
120 currentFileName = reader.text().toString();
121 if (currentFileName.isEmpty())
122 continue;
123
124 writer.writeStartElement(QStringLiteral("file"));
125
126 if (!fileAttributes.hasAttribute(QStringLiteral("alias")))
127 fileAttributes.append(QStringLiteral("alias"), currentFileName);
128
129 currentFileName = inputDirectory.absoluteFilePath(currentFileName);
130 currentFileName = outputDirectory.relativeFilePath(currentFileName);
131
132 writer.writeAttributes(fileAttributes);
133 writer.writeCharacters(currentFileName);
134 writer.writeEndElement();
135 continue;
136
137 default: break;
138 }
139 }
140
143 fprintf(stderr, "Cannot open %s for writing.\n", qPrintable(output));
144 return EXIT_FAILURE;
145 }
146 const QByteArray outputStringUtf8 = outputString.toUtf8();
147 if (outputFile.write(outputStringUtf8) != outputStringUtf8.size())
148 return EXIT_FAILURE;
149
150 outputFile.close();
151 if (outputFile.error() != QFileDevice::NoError)
152 return EXIT_FAILURE;
153
154
155 return EXIT_SUCCESS;
156}
157
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtCore
Definition qdir.h:20
QString relativeFilePath(const QString &fileName) const
Returns the path to fileName relative to the directory.
Definition qdir.cpp:843
QDir absoluteDir() const
Returns a QDir object representing the absolute path of the parent directory of the file system entry...
\inmodule QtCore
Definition qfile.h:93
QFILE_MAYBE_NODISCARD bool open(OpenMode flags) override
Opens the file using OpenMode mode, returning true if successful; otherwise false.
Definition qfile.cpp:904
QString text(const QString &key) const
\inmodule QtCore
Definition qstringview.h:78
constexpr bool isEmpty() const noexcept
Returns whether this string view is empty - that is, whether {size() == 0}.
QString toString() const
Returns a deep copy of this string view's data as a QString.
Definition qstring.h:1121
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
bool startsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string starts with s; otherwise returns false.
Definition qstring.cpp:5455
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:192
bool endsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string ends with s; otherwise returns false.
Definition qstring.cpp:5506
QString & append(QChar c)
Definition qstring.cpp:3252
QByteArray toUtf8() const &
Definition qstring.h:634
QString & prepend(QChar c)
Definition qstring.h:478
else opt state
[0]
Combined button and popup list for selecting options.
static QString outputFile
GLenum GLenum GLenum input
QT_BEGIN_NAMESPACE int qRelocateResourceFile(const QString &input, const QString &output)
#define qPrintable(string)
Definition qstring.h:1531
#define QStringLiteral(str)
QT_BEGIN_NAMESPACE typedef uchar * output
QFile file
[0]
\inmodule QtCore \reentrant
Definition qchar.h:18