26 State state = InitialState;
29 QString currentFileName;
30 QXmlStreamAttributes fileAttributes;
33 if (!file.open(QIODevice::ReadOnly)) {
34 fprintf(stderr,
"Cannot open %s for reading.\n", qPrintable(input));
38 QDir inputDirectory = QFileInfo(file).absoluteDir();
39 QDir outputDirectory = QFileInfo(output).absoluteDir();
42 QXmlStreamWriter writer(&outputString);
43 writer.setAutoFormatting(
true);
45 QXmlStreamReader reader(&file);
46 while (!reader.atEnd()) {
47 switch (reader.readNext()) {
48 case QXmlStreamReader::StartDocument: {
49 QStringView version = reader.documentVersion();
50 if (!version.isEmpty())
51 writer.writeStartDocument(version.toString());
53 writer.writeStartDocument();
56 case QXmlStreamReader::EndDocument:
57 writer.writeEndDocument();
59 case QXmlStreamReader::StartElement:
60 if (reader.name() == QStringLiteral(
"RCC")) {
61 if (state != InitialState) {
62 fprintf(stderr,
"Unexpected RCC tag in line %d\n",
int(reader.lineNumber()));
66 }
else if (reader.name() == QStringLiteral(
"qresource")) {
68 fprintf(stderr,
"Unexpected qresource tag in line %d\n",
int(reader.lineNumber()));
72 QXmlStreamAttributes attributes = reader.attributes();
73 if (attributes.hasAttribute(QStringLiteral(
"prefix")))
74 prefix = attributes.value(QStringLiteral(
"prefix")).toString();
75 if (!prefix.startsWith(QLatin1Char(
'/')))
76 prefix.prepend(QLatin1Char(
'/'));
77 if (!prefix.endsWith(QLatin1Char(
'/')))
78 prefix.append(QLatin1Char(
'/'));
79 }
else if (reader.name() == QStringLiteral(
"file")) {
80 if (state != InResource) {
81 fprintf(stderr,
"Unexpected file tag in line %d\n",
int(reader.lineNumber()));
85 fileAttributes = reader.attributes();
88 writer.writeStartElement(reader.name().toString());
89 writer.writeAttributes(reader.attributes());
92 case QXmlStreamReader::EndElement:
93 if (reader.name() == QStringLiteral(
"file")) {
94 if (state != InFile) {
95 fprintf(stderr,
"Unexpected end of file tag in line %d\n",
int(reader.lineNumber()));
100 }
else if (reader.name() == QStringLiteral(
"qresource")) {
101 if (state != InResource) {
102 fprintf(stderr,
"Unexpected end of qresource tag in line %d\n",
int(reader.lineNumber()));
106 }
else if (reader.name() == QStringLiteral(
"RCC")) {
107 if (state != InRCC) {
108 fprintf(stderr,
"Unexpected end of RCC tag in line %d\n",
int(reader.lineNumber()));
111 state = InitialState;
113 writer.writeEndElement();
116 case QXmlStreamReader::Characters:
117 if (reader.isWhitespace())
121 currentFileName = reader.text().toString();
122 if (currentFileName.isEmpty())
125 writer.writeStartElement(QStringLiteral(
"file"));
127 if (!fileAttributes.hasAttribute(QStringLiteral(
"alias")))
128 fileAttributes.append(QStringLiteral(
"alias"), currentFileName);
130 currentFileName = inputDirectory.absoluteFilePath(currentFileName);
131 currentFileName = outputDirectory.relativeFilePath(currentFileName);
133 writer.writeAttributes(fileAttributes);
134 writer.writeCharacters(currentFileName);
135 writer.writeEndElement();
142 QFile outputFile(output);
143 if (!outputFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
144 fprintf(stderr,
"Cannot open %s for writing.\n", qPrintable(output));
147 const QByteArray outputStringUtf8 = outputString.toUtf8();
148 if (outputFile.write(outputStringUtf8) != outputStringUtf8.size())
152 if (outputFile.error() != QFileDevice::NoError)