annotate tools/drcc/rcc.cpp @ 61:a2871e6b8b15

drcc: automatic initialization of resources with program start (disabled with option -no-static-initialize) demos: resources fixes. examples: resources fixes.
author SokoL_SD
date Tue, 19 May 2009 10:48:30 +0000
parents 7be693ea7070
children 39337877e05c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
57
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
1 /****************************************************************************
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
2 **
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
4 ** Contact: Qt Software Information (qt-info@nokia.com)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
5 **
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
6 ** This file is part of the tools applications of the Qt Toolkit.
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
7 **
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
8 ** $QT_BEGIN_LICENSE:LGPL$
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
9 ** Commercial Usage
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
10 ** Licensees holding valid Qt Commercial licenses may use this file in
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
11 ** accordance with the Qt Commercial License Agreement provided with the
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
12 ** Software or, alternatively, in accordance with the terms contained in
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
13 ** a written agreement between you and Nokia.
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
14 **
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
15 ** GNU Lesser General Public License Usage
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
16 ** Alternatively, this file may be used under the terms of the GNU Lesser
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
17 ** General Public License version 2.1 as published by the Free Software
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
18 ** Foundation and appearing in the file LICENSE.LGPL included in the
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
19 ** packaging of this file. Please review the following information to
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
20 ** ensure the GNU Lesser General Public License version 2.1 requirements
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
21 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
22 **
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
23 ** In addition, as a special exception, Nokia gives you certain
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
24 ** additional rights. These rights are described in the Nokia Qt LGPL
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
25 ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
26 ** package.
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
27 **
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
28 ** GNU General Public License Usage
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
29 ** Alternatively, this file may be used under the terms of the GNU
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
30 ** General Public License version 3.0 as published by the Free Software
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
31 ** Foundation and appearing in the file LICENSE.GPL included in the
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
32 ** packaging of this file. Please review the following information to
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
33 ** ensure the GNU General Public License version 3.0 requirements will be
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
34 ** met: http://www.gnu.org/copyleft/gpl.html.
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
35 **
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
36 ** If you are unsure which license is appropriate for your use, please
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
37 ** contact the sales department at qt-sales@nokia.com.
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
38 ** $QT_END_LICENSE$
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
39 **
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
40 ****************************************************************************/
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
41
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
42 #include "rcc.h"
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
43
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
44 #include <QtCore/QByteArray>
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
45 #include <QtCore/QDateTime>
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
46 #include <QtCore/QDebug>
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
47 #include <QtCore/QDir>
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
48 #include <QtCore/QDirIterator>
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
49 #include <QtCore/QFile>
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
50 #include <QtCore/QIODevice>
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
51 #include <QtCore/QLocale>
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
52 #include <QtCore/QStack>
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
53
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
54 #include <QtXml/QDomDocument>
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
55
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
56 QT_BEGIN_NAMESPACE
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
57
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
58 enum {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
59 CONSTANT_USENAMESPACE = 1,
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
60 CONSTANT_COMPRESSLEVEL_DEFAULT = -1,
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
61 CONSTANT_COMPRESSTHRESHOLD_DEFAULT = 70
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
62 };
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
63
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
64
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
65 #define writeString(s) write(s, sizeof(s))
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
66
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
67 void RCCResourceLibrary::write(const char *str, int len)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
68 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
69 --len; // trailing \0 on string literals...
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
70 int n = m_out.size();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
71 m_out.resize(n + len);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
72 memcpy(m_out.data() + n, str, len);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
73 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
74
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
75 void RCCResourceLibrary::writeByteArray(const QByteArray &other)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
76 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
77 m_out.append(other);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
78 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
79
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
80 static inline QString msgOpenReadFailed(const QString &fname, const QString &why)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
81 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
82 return QString::fromUtf8("Unable to open %1 for reading: %2\n").arg(fname).arg(why);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
83 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
84
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
85
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
86 ///////////////////////////////////////////////////////////
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
87 //
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
88 // RCCFileInfo
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
89 //
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
90 ///////////////////////////////////////////////////////////
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
91
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
92 class RCCFileInfo
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
93 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
94 public:
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
95 enum Flags
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
96 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
97 NoFlags = 0x00,
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
98 Compressed = 0x01,
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
99 Directory = 0x02
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
100 };
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
101
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
102 RCCFileInfo(const QString &name = QString(), const QFileInfo &fileInfo = QFileInfo(),
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
103 QLocale::Language language = QLocale::C,
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
104 QLocale::Country country = QLocale::AnyCountry,
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
105 uint flags = NoFlags,
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
106 int compressLevel = CONSTANT_COMPRESSLEVEL_DEFAULT,
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
107 int compressThreshold = CONSTANT_COMPRESSTHRESHOLD_DEFAULT);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
108 ~RCCFileInfo();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
109
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
110 QString resourceName() const;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
111
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
112 public:
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
113 qint64 writeDataBlob(RCCResourceLibrary &lib, qint64 offset, QString *errorMessage);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
114 qint64 writeDataName(RCCResourceLibrary &, qint64 offset);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
115 void writeDataInfo(RCCResourceLibrary &lib);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
116
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
117 int m_flags;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
118 QString m_name;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
119 QLocale::Language m_language;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
120 QLocale::Country m_country;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
121 QFileInfo m_fileInfo;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
122 RCCFileInfo *m_parent;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
123 QHash<QString, RCCFileInfo*> m_children;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
124 int m_compressLevel;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
125 int m_compressThreshold;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
126
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
127 qint64 m_nameOffset;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
128 qint64 m_dataOffset;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
129 qint64 m_childOffset;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
130 };
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
131
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
132 RCCFileInfo::RCCFileInfo(const QString &name, const QFileInfo &fileInfo,
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
133 QLocale::Language language, QLocale::Country country, uint flags,
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
134 int compressLevel, int compressThreshold)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
135 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
136 m_name = name;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
137 m_fileInfo = fileInfo;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
138 m_language = language;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
139 m_country = country;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
140 m_flags = flags;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
141 m_parent = 0;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
142 m_nameOffset = 0;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
143 m_dataOffset = 0;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
144 m_childOffset = 0;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
145 m_compressLevel = compressLevel;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
146 m_compressThreshold = compressThreshold;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
147 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
148
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
149 RCCFileInfo::~RCCFileInfo()
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
150 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
151 qDeleteAll(m_children);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
152 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
153
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
154 QString RCCFileInfo::resourceName() const
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
155 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
156 QString resource = m_name;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
157 for (RCCFileInfo *p = m_parent; p; p = p->m_parent)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
158 resource = resource.prepend(p->m_name + QLatin1Char('/'));
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
159 return QLatin1Char(':') + resource;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
160 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
161
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
162 void RCCFileInfo::writeDataInfo(RCCResourceLibrary &lib)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
163 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
164 const bool text = (lib.m_format == RCCResourceLibrary::C_Code);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
165 //some info
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
166 if (text) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
167 if (m_language != QLocale::C) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
168 lib.writeString(" // ");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
169 lib.writeByteArray(resourceName().toLocal8Bit());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
170 lib.writeString(" [");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
171 lib.writeByteArray(QByteArray::number(m_country));
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
172 lib.writeString("::");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
173 lib.writeByteArray(QByteArray::number(m_language));
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
174 lib.writeString("[\n ");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
175 } else {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
176 lib.writeString(" // ");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
177 lib.writeByteArray(resourceName().toLocal8Bit());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
178 lib.writeString("\n ");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
179 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
180 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
181
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
182 //pointer data
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
183 if (m_flags & RCCFileInfo::Directory) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
184 // name offset
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
185 lib.writeNumber4(m_nameOffset);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
186
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
187 // flags
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
188 lib.writeNumber2(m_flags);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
189
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
190 // child count
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
191 lib.writeNumber4(m_children.size());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
192
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
193 // first child offset
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
194 lib.writeNumber4(m_childOffset);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
195 } else {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
196 // name offset
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
197 lib.writeNumber4(m_nameOffset);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
198
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
199 // flags
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
200 lib.writeNumber2(m_flags);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
201
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
202 // locale
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
203 lib.writeNumber2(m_country);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
204 lib.writeNumber2(m_language);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
205
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
206 //data offset
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
207 lib.writeNumber4(m_dataOffset);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
208 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
209 if (text)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
210 lib.writeChar('\n');
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
211 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
212
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
213 qint64 RCCFileInfo::writeDataBlob(RCCResourceLibrary &lib, qint64 offset,
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
214 QString *errorMessage)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
215 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
216 const bool text = (lib.m_format == RCCResourceLibrary::C_Code);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
217
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
218 //capture the offset
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
219 m_dataOffset = offset;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
220
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
221 //find the data to be written
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
222 QFile file(m_fileInfo.absoluteFilePath());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
223 if (!file.open(QFile::ReadOnly)) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
224 *errorMessage = msgOpenReadFailed(m_fileInfo.absoluteFilePath(), file.errorString());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
225 return 0;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
226 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
227 QByteArray data = file.readAll();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
228
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
229 #ifndef QT_NO_COMPRESS
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
230 // Check if compression is useful for this file
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
231 if (m_compressLevel != 0 && data.size() != 0) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
232 QByteArray compressed =
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
233 qCompress(reinterpret_cast<uchar *>(data.data()), data.size(), m_compressLevel);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
234
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
235 int compressRatio = int(100.0 * (data.size() - compressed.size()) / data.size());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
236 if (compressRatio >= m_compressThreshold) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
237 data = compressed;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
238 m_flags |= Compressed;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
239 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
240 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
241 #endif // QT_NO_COMPRESS
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
242
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
243 // some info
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
244 if (text) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
245 lib.writeString(" // ");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
246 lib.writeByteArray(m_fileInfo.absoluteFilePath().toLocal8Bit());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
247 lib.writeString("\n ");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
248 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
249
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
250 // write the length
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
251
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
252 lib.writeNumber4(data.size());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
253 if (text)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
254 lib.writeString("\n ");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
255 offset += 4;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
256
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
257 // write the payload
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
258 const char *p = data.constData();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
259 if (text) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
260 for (int i = data.size(), j = 0; --i >= 0; --j) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
261 lib.writeHex(*p++);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
262 if (j == 0) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
263 lib.writeString("\n ");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
264 j = 16;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
265 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
266 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
267 } else {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
268 for (int i = data.size(); --i >= 0; )
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
269 lib.writeChar(*p++);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
270 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
271 offset += data.size();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
272
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
273 // done
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
274 if (text)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
275 lib.writeString("\n ");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
276 return offset;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
277 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
278
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
279 qint64 RCCFileInfo::writeDataName(RCCResourceLibrary &lib, qint64 offset)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
280 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
281 const bool text = (lib.m_format == RCCResourceLibrary::C_Code);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
282
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
283 // capture the offset
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
284 m_nameOffset = offset;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
285
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
286 // some info
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
287 if (text) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
288 lib.writeString(" // ");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
289 lib.writeByteArray(m_name.toLocal8Bit());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
290 lib.writeString("\n ");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
291 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
292
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
293 // write the length
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
294 lib.writeNumber2(m_name.length());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
295 if (text)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
296 lib.writeString("\n ");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
297 offset += 2;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
298
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
299 // write the hash
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
300 lib.writeNumber4(qHash(m_name));
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
301 if (text)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
302 lib.writeString("\n ");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
303 offset += 4;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
304
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
305 // write the m_name
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
306 const QChar *unicode = m_name.unicode();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
307 for (int i = 0; i < m_name.length(); ++i) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
308 lib.writeNumber2(unicode[i].unicode());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
309 if (text && i % 16 == 0)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
310 lib.writeString("\n ");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
311 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
312 offset += m_name.length()*2;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
313
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
314 // done
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
315 if (text)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
316 lib.writeString("\n ");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
317 return offset;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
318 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
319
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
320
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
321 ///////////////////////////////////////////////////////////
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
322 //
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
323 // RCCResourceLibrary
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
324 //
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
325 ///////////////////////////////////////////////////////////
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
326
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
327 RCCResourceLibrary::Strings::Strings() :
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
328 TAG_RCC(QLatin1String("RCC")),
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
329 TAG_RESOURCE(QLatin1String("qresource")),
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
330 TAG_FILE(QLatin1String("file")),
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
331 ATTRIBUTE_LANG(QLatin1String("lang")),
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
332 ATTRIBUTE_PREFIX(QLatin1String("prefix")),
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
333 ATTRIBUTE_ALIAS(QLatin1String("alias")),
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
334 ATTRIBUTE_THRESHOLD(QLatin1String("threshold")),
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
335 ATTRIBUTE_COMPRESS(QLatin1String("compress"))
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
336 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
337 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
338
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
339 RCCResourceLibrary::RCCResourceLibrary()
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
340 : m_root(0),
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
341 m_format(C_Code),
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
342 m_verbose(false),
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
343 m_compressLevel(CONSTANT_COMPRESSLEVEL_DEFAULT),
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
344 m_compressThreshold(CONSTANT_COMPRESSTHRESHOLD_DEFAULT),
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
345 m_treeOffset(0),
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
346 m_namesOffset(0),
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
347 m_dataOffset(0),
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
348 m_useNameSpace(CONSTANT_USENAMESPACE),
61
a2871e6b8b15 drcc: automatic initialization of resources with program start (disabled with option -no-static-initialize)
SokoL_SD
parents: 57
diff changeset
349 m_errorDevice(0),
a2871e6b8b15 drcc: automatic initialization of resources with program start (disabled with option -no-static-initialize)
SokoL_SD
parents: 57
diff changeset
350 m_staticInitialize(true)
57
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
351 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
352 m_out.reserve(30 * 1000 * 1000);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
353 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
354
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
355 RCCResourceLibrary::~RCCResourceLibrary()
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
356 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
357 delete m_root;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
358 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
359
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
360 bool RCCResourceLibrary::interpretResourceFile(QIODevice *inputDevice,
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
361 const QString &fname, QString currentPath, bool ignoreErrors)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
362 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
363 Q_ASSERT(m_errorDevice);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
364 const QChar slash = QLatin1Char('/');
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
365 if (!currentPath.isEmpty() && !currentPath.endsWith(slash))
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
366 currentPath += slash;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
367
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
368 QDomDocument document;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
369 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
370 QString errorMsg;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
371 int errorLine = 0;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
372 int errorColumn = 0;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
373 if (!document.setContent(inputDevice, &errorMsg, &errorLine, &errorColumn)) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
374 if (ignoreErrors)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
375 return true;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
376 const QString msg = QString::fromUtf8("RCC Parse Error: '%1' Line: %2 Column: %3 [%4]\n").arg(fname).arg(errorLine).arg(errorColumn).arg(errorMsg);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
377 m_errorDevice->write(msg.toUtf8());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
378 return false;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
379 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
380 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
381
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
382 QDomElement domRoot = document.firstChildElement(m_strings.TAG_RCC).toElement();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
383 if (!domRoot.isNull() && domRoot.tagName() == m_strings.TAG_RCC) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
384 for (QDomNode node = domRoot.firstChild(); !node.isNull(); node = node.nextSibling()) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
385 if (!node.isElement())
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
386 continue;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
387
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
388 QDomElement child = node.toElement();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
389 if (!child.isNull() && child.tagName() == m_strings.TAG_RESOURCE) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
390 QLocale::Language language = QLocale::c().language();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
391 QLocale::Country country = QLocale::c().country();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
392
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
393 if (child.hasAttribute(m_strings.ATTRIBUTE_LANG)) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
394 QString attribute = child.attribute(m_strings.ATTRIBUTE_LANG);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
395 QLocale lang = QLocale(attribute);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
396 language = lang.language();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
397 if (2 == attribute.length()) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
398 // Language only
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
399 country = QLocale::AnyCountry;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
400 } else {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
401 country = lang.country();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
402 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
403 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
404
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
405 QString prefix;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
406 if (child.hasAttribute(m_strings.ATTRIBUTE_PREFIX))
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
407 prefix = child.attribute(m_strings.ATTRIBUTE_PREFIX);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
408 if (!prefix.startsWith(slash))
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
409 prefix.prepend(slash);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
410 if (!prefix.endsWith(slash))
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
411 prefix += slash;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
412
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
413 for (QDomNode res = child.firstChild(); !res.isNull(); res = res.nextSibling()) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
414 if (res.isElement() && res.toElement().tagName() == m_strings.TAG_FILE) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
415
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
416 QString fileName(res.firstChild().toText().data());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
417 if (fileName.isEmpty()) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
418 const QString msg = QString::fromUtf8("RCC: Warning: Null node in XML of '%1'\n").arg(fname);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
419 m_errorDevice->write(msg.toUtf8());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
420 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
421 QString alias;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
422 if (res.toElement().hasAttribute(m_strings.ATTRIBUTE_ALIAS))
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
423 alias = res.toElement().attribute(m_strings.ATTRIBUTE_ALIAS);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
424 else
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
425 alias = fileName;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
426
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
427 int compressLevel = m_compressLevel;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
428 if (res.toElement().hasAttribute(m_strings.ATTRIBUTE_COMPRESS))
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
429 compressLevel = res.toElement().attribute(m_strings.ATTRIBUTE_COMPRESS).toInt();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
430 int compressThreshold = m_compressThreshold;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
431 if (res.toElement().hasAttribute(m_strings.ATTRIBUTE_THRESHOLD))
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
432 compressThreshold = res.toElement().attribute(m_strings.ATTRIBUTE_THRESHOLD).toInt();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
433
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
434 // Special case for -no-compress. Overrides all other settings.
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
435 if (m_compressLevel == -2)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
436 compressLevel = 0;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
437
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
438 alias = QDir::cleanPath(alias);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
439 while (alias.startsWith(QLatin1String("../")))
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
440 alias.remove(0, 3);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
441 alias = QDir::cleanPath(m_resourceRoot) + prefix + alias;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
442
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
443 QString absFileName = fileName;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
444 if (QDir::isRelativePath(absFileName))
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
445 absFileName.prepend(currentPath);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
446 QFileInfo file(absFileName);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
447 if (!file.exists()) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
448 m_failedResources.push_back(absFileName);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
449 const QString msg = QString::fromUtf8("RCC: Error in '%1': Cannot find file '%2'\n").arg(fname).arg(fileName);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
450 m_errorDevice->write(msg.toUtf8());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
451 if (ignoreErrors)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
452 continue;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
453 else
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
454 return false;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
455 } else if (file.isFile()) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
456 const bool arc = addFile(alias, RCCFileInfo(alias.section(slash, -1), file, language, country,
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
457 RCCFileInfo::NoFlags, compressLevel, compressThreshold));
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
458 if (!arc)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
459 m_failedResources.push_back(absFileName);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
460 } else {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
461 QDir dir;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
462 if (file.isDir()) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
463 dir.setPath(file.filePath());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
464 } else {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
465 dir.setPath(file.path());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
466 dir.setNameFilters(QStringList(file.fileName()));
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
467 if (alias.endsWith(file.fileName()))
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
468 alias = alias.left(alias.length()-file.fileName().length());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
469 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
470 if (!alias.endsWith(slash))
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
471 alias += slash;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
472 QDirIterator it(dir, QDirIterator::FollowSymlinks|QDirIterator::Subdirectories);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
473 while (it.hasNext()) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
474 it.next();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
475 QFileInfo child(it.fileInfo());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
476 if (child.fileName() != QLatin1String(".") && child.fileName() != QLatin1String("..")) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
477 const bool arc = addFile(alias + child.fileName(),
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
478 RCCFileInfo(child.fileName(), child, language, country,
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
479 RCCFileInfo::NoFlags, compressLevel, compressThreshold));
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
480 if (!arc)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
481 m_failedResources.push_back(child.fileName());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
482 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
483 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
484 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
485 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
486 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
487 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
488 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
489 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
490 if (m_root == 0) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
491 const QString msg = QString::fromUtf8("RCC: Warning: No resources in '%1'.\n").arg(fname);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
492 m_errorDevice->write(msg.toUtf8());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
493 if (!ignoreErrors && m_format == Binary) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
494 // create dummy entry, otherwise loading qith QResource will crash
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
495 m_root = new RCCFileInfo(QString(), QFileInfo(),
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
496 QLocale::C, QLocale::AnyCountry, RCCFileInfo::Directory);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
497 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
498 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
499
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
500 return true;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
501 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
502
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
503 bool RCCResourceLibrary::addFile(const QString &alias, const RCCFileInfo &file)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
504 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
505 Q_ASSERT(m_errorDevice);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
506 if (file.m_fileInfo.size() > 0xffffffff) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
507 const QString msg = QString::fromUtf8("File too big: %1\n").arg(file.m_fileInfo.absoluteFilePath());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
508 m_errorDevice->write(msg.toUtf8());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
509 return false;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
510 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
511 if (!m_root)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
512 m_root = new RCCFileInfo(QString(), QFileInfo(), QLocale::C, QLocale::AnyCountry, RCCFileInfo::Directory);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
513
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
514 RCCFileInfo *parent = m_root;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
515 const QStringList nodes = alias.split(QLatin1Char('/'));
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
516 for (int i = 1; i < nodes.size()-1; ++i) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
517 const QString node = nodes.at(i);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
518 if (node.isEmpty())
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
519 continue;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
520 if (!parent->m_children.contains(node)) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
521 RCCFileInfo *s = new RCCFileInfo(node, QFileInfo(), QLocale::C, QLocale::AnyCountry, RCCFileInfo::Directory);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
522 s->m_parent = parent;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
523 parent->m_children.insert(node, s);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
524 parent = s;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
525 } else {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
526 parent = parent->m_children[node];
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
527 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
528 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
529
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
530 const QString filename = nodes.at(nodes.size()-1);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
531 RCCFileInfo *s = new RCCFileInfo(file);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
532 s->m_parent = parent;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
533 parent->m_children.insertMulti(filename, s);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
534 return true;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
535 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
536
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
537 void RCCResourceLibrary::reset()
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
538 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
539 if (m_root) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
540 delete m_root;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
541 m_root = 0;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
542 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
543 m_errorDevice = 0;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
544 m_failedResources.clear();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
545 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
546
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
547
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
548 bool RCCResourceLibrary::readFiles(bool ignoreErrors, QIODevice &errorDevice)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
549 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
550 reset();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
551 m_errorDevice = &errorDevice;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
552 //read in data
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
553 if (m_verbose) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
554 const QString msg = QString::fromUtf8("Processing %1 files [%2]\n")
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
555 .arg(m_fileNames.size()).arg(static_cast<int>(ignoreErrors));
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
556 m_errorDevice->write(msg.toUtf8());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
557 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
558 for (int i = 0; i < m_fileNames.size(); ++i) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
559 QFile fileIn;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
560 QString fname = m_fileNames.at(i);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
561 QString pwd;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
562 if (fname == QLatin1String("-")) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
563 fname = QLatin1String("(stdin)");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
564 pwd = QDir::currentPath();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
565 fileIn.setFileName(fname);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
566 if (!fileIn.open(stdin, QIODevice::ReadOnly)) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
567 m_errorDevice->write(msgOpenReadFailed(fname, fileIn.errorString()).toUtf8());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
568 return false;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
569 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
570 } else {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
571 pwd = QFileInfo(fname).path();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
572 fileIn.setFileName(fname);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
573 if (!fileIn.open(QIODevice::ReadOnly)) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
574 m_errorDevice->write(msgOpenReadFailed(fname, fileIn.errorString()).toUtf8());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
575 return false;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
576 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
577 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
578 if (m_verbose) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
579 const QString msg = QString::fromUtf8("Interpreting %1\n").arg(fname);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
580 m_errorDevice->write(msg.toUtf8());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
581 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
582
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
583 if (!interpretResourceFile(&fileIn, fname, pwd, ignoreErrors))
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
584 return false;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
585 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
586 return true;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
587 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
588
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
589 QStringList RCCResourceLibrary::dataFiles() const
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
590 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
591 QStringList ret;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
592 QStack<RCCFileInfo*> pending;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
593
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
594 if (!m_root)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
595 return ret;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
596 pending.push(m_root);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
597 while (!pending.isEmpty()) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
598 RCCFileInfo *file = pending.pop();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
599 for (QHash<QString, RCCFileInfo*>::iterator it = file->m_children.begin();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
600 it != file->m_children.end(); ++it) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
601 RCCFileInfo *child = it.value();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
602 if (child->m_flags & RCCFileInfo::Directory)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
603 pending.push(child);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
604 ret.append(child->m_fileInfo.filePath());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
605 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
606 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
607 return ret;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
608 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
609
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
610 // Determine map of resource identifier (':/newPrefix/images/p1.png') to file via recursion
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
611 static void resourceDataFileMapRecursion(const RCCFileInfo *m_root, const QString &path, RCCResourceLibrary::ResourceDataFileMap &m)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
612 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
613 typedef QHash<QString, RCCFileInfo*>::const_iterator ChildConstIterator;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
614 const QChar slash = QLatin1Char('/');
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
615 const ChildConstIterator cend = m_root->m_children.constEnd();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
616 for (ChildConstIterator it = m_root->m_children.constBegin(); it != cend; ++it) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
617 const RCCFileInfo *child = it.value();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
618 QString childName = path;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
619 childName += slash;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
620 childName += child->m_name;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
621 if (child->m_flags & RCCFileInfo::Directory) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
622 resourceDataFileMapRecursion(child, childName, m);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
623 } else {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
624 m.insert(childName, child->m_fileInfo.filePath());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
625 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
626 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
627 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
628
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
629 RCCResourceLibrary::ResourceDataFileMap RCCResourceLibrary::resourceDataFileMap() const
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
630 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
631 ResourceDataFileMap rc;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
632 if (m_root)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
633 resourceDataFileMapRecursion(m_root, QString(QLatin1Char(':')), rc);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
634 return rc;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
635 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
636
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
637 bool RCCResourceLibrary::output(QIODevice &outDevice, QIODevice &errorDevice)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
638 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
639 m_errorDevice = &errorDevice;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
640 //write out
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
641 if (m_verbose)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
642 m_errorDevice->write("Outputting code\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
643 if (!writeHeader()) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
644 m_errorDevice->write("Could not write header\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
645 return false;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
646 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
647 if (m_root) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
648 if (!writeDataBlobs()) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
649 m_errorDevice->write("Could not write data blobs.\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
650 return false;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
651 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
652 if (!writeDataNames()) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
653 m_errorDevice->write("Could not write file names\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
654 return false;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
655 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
656 if (!writeDataStructure()) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
657 m_errorDevice->write("Could not write data tree\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
658 return false;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
659 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
660 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
661 if (!writeInitializer()) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
662 m_errorDevice->write("Could not write footer\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
663 return false;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
664 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
665 outDevice.write(m_out, m_out.size());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
666 return true;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
667 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
668
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
669 void RCCResourceLibrary::writeHex(quint8 tmp)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
670 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
671 const char * const digits = "0123456789abcdef";
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
672 writeChar('0');
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
673 writeChar('x');
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
674 if (tmp < 16) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
675 writeChar(digits[tmp]);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
676 } else {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
677 writeChar(digits[tmp >> 4]);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
678 writeChar(digits[tmp & 0xf]);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
679 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
680 writeChar(',');
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
681 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
682
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
683 void RCCResourceLibrary::writeNumber2(quint16 number)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
684 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
685 if (m_format == RCCResourceLibrary::Binary) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
686 writeChar(number >> 8);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
687 writeChar(number);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
688 } else {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
689 writeHex(number >> 8);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
690 writeHex(number);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
691 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
692 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
693
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
694 void RCCResourceLibrary::writeNumber4(quint32 number)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
695 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
696 if (m_format == RCCResourceLibrary::Binary) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
697 writeChar(number >> 24);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
698 writeChar(number >> 16);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
699 writeChar(number >> 8);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
700 writeChar(number);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
701 } else {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
702 writeHex(number >> 24);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
703 writeHex(number >> 16);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
704 writeHex(number >> 8);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
705 writeHex(number);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
706 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
707 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
708
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
709 bool RCCResourceLibrary::writeHeader()
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
710 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
711 if (m_format == C_Code) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
712 writeString("/****************************************************************************\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
713 writeString("** Resource object code\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
714 writeString("**\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
715 writeString("** Created: ");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
716 writeByteArray(QDateTime::currentDateTime().toString().toLatin1());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
717 writeString("\n** by: The Resource Compiler for Qt version ");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
718 writeByteArray(QT_VERSION_STR);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
719 writeString("\n**\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
720 writeString("** WARNING! All changes made in this file will be lost!\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
721 writeString( "*****************************************************************************/\n\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
722 } else if (m_format == Binary) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
723 writeString("qres");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
724 writeNumber4(0);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
725 writeNumber4(0);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
726 writeNumber4(0);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
727 writeNumber4(0);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
728 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
729 return true;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
730 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
731
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
732 bool RCCResourceLibrary::writeDataBlobs()
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
733 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
734 Q_ASSERT(m_errorDevice);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
735 if (m_format == C_Code)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
736 writeString("static const ubyte[] qt_resource_data = [\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
737 else if (m_format == Binary)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
738 m_dataOffset = m_out.size();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
739 QStack<RCCFileInfo*> pending;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
740
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
741 if (!m_root)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
742 return false;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
743
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
744 pending.push(m_root);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
745 qint64 offset = 0;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
746 QString errorMessage;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
747 while (!pending.isEmpty()) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
748 RCCFileInfo *file = pending.pop();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
749 for (QHash<QString, RCCFileInfo*>::iterator it = file->m_children.begin();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
750 it != file->m_children.end(); ++it) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
751 RCCFileInfo *child = it.value();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
752 if (child->m_flags & RCCFileInfo::Directory)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
753 pending.push(child);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
754 else {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
755 offset = child->writeDataBlob(*this, offset, &errorMessage);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
756 if (offset == 0)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
757 m_errorDevice->write(errorMessage.toUtf8());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
758 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
759 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
760 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
761 if (m_format == C_Code)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
762 writeString("\n];\n\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
763 return true;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
764 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
765
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
766 bool RCCResourceLibrary::writeDataNames()
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
767 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
768 if (m_format == C_Code)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
769 writeString("static const ubyte[] qt_resource_name = [\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
770 else if (m_format == Binary)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
771 m_namesOffset = m_out.size();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
772
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
773 QHash<QString, int> names;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
774 QStack<RCCFileInfo*> pending;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
775
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
776 if (!m_root)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
777 return false;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
778
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
779 pending.push(m_root);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
780 qint64 offset = 0;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
781 while (!pending.isEmpty()) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
782 RCCFileInfo *file = pending.pop();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
783 for (QHash<QString, RCCFileInfo*>::iterator it = file->m_children.begin();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
784 it != file->m_children.end(); ++it) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
785 RCCFileInfo *child = it.value();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
786 if (child->m_flags & RCCFileInfo::Directory)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
787 pending.push(child);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
788 if (names.contains(child->m_name)) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
789 child->m_nameOffset = names.value(child->m_name);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
790 } else {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
791 names.insert(child->m_name, offset);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
792 offset = child->writeDataName(*this, offset);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
793 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
794 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
795 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
796 if (m_format == C_Code)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
797 writeString("\n];\n\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
798 return true;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
799 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
800
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
801 static bool qt_rcc_compare_hash(const RCCFileInfo *left, const RCCFileInfo *right)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
802 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
803 return qHash(left->m_name) < qHash(right->m_name);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
804 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
805
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
806 bool RCCResourceLibrary::writeDataStructure()
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
807 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
808 if (m_format == C_Code)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
809 writeString("static const ubyte[] qt_resource_struct = [\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
810 else if (m_format == Binary)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
811 m_treeOffset = m_out.size();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
812 QStack<RCCFileInfo*> pending;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
813
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
814 if (!m_root)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
815 return false;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
816
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
817 //calculate the child offsets (flat)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
818 pending.push(m_root);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
819 int offset = 1;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
820 while (!pending.isEmpty()) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
821 RCCFileInfo *file = pending.pop();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
822 file->m_childOffset = offset;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
823
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
824 //sort by hash value for binary lookup
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
825 QList<RCCFileInfo*> m_children = file->m_children.values();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
826 qSort(m_children.begin(), m_children.end(), qt_rcc_compare_hash);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
827
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
828 //write out the actual data now
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
829 for (int i = 0; i < m_children.size(); ++i) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
830 RCCFileInfo *child = m_children.at(i);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
831 ++offset;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
832 if (child->m_flags & RCCFileInfo::Directory)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
833 pending.push(child);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
834 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
835 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
836
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
837 //write out the structure (ie iterate again!)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
838 pending.push(m_root);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
839 m_root->writeDataInfo(*this);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
840 while (!pending.isEmpty()) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
841 RCCFileInfo *file = pending.pop();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
842
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
843 //sort by hash value for binary lookup
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
844 QList<RCCFileInfo*> m_children = file->m_children.values();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
845 qSort(m_children.begin(), m_children.end(), qt_rcc_compare_hash);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
846
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
847 //write out the actual data now
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
848 for (int i = 0; i < m_children.size(); ++i) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
849 RCCFileInfo *child = m_children.at(i);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
850 child->writeDataInfo(*this);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
851 if (child->m_flags & RCCFileInfo::Directory)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
852 pending.push(child);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
853 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
854 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
855 if (m_format == C_Code)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
856 writeString("\n];\n\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
857
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
858 return true;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
859 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
860
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
861 void RCCResourceLibrary::writeMangleNamespaceFunction(const QByteArray &name)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
862 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
863 if (m_useNameSpace) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
864 // qtd writeString("QT_MANGLE_NAMESPACE(");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
865 writeByteArray(name);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
866 // qtd writeChar(')');
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
867 } else {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
868 writeByteArray(name);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
869 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
870 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
871
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
872 void RCCResourceLibrary::writeAddNamespaceFunction(const QByteArray &name)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
873 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
874 if (m_useNameSpace) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
875 writeString("QT_PREPEND_NAMESPACE(");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
876 writeByteArray(name);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
877 writeChar(')');
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
878 } else {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
879 writeByteArray(name);
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
880 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
881 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
882
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
883 bool RCCResourceLibrary::writeInitializer()
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
884 {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
885 if (m_format == C_Code) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
886 //write("\nQT_BEGIN_NAMESPACE\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
887 QString initName = m_initName;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
888 if (!initName.isEmpty()) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
889 initName.prepend(QLatin1Char('_'));
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
890 initName.replace(QRegExp(QLatin1String("[^a-zA-Z0-9_]")), QLatin1String("_"));
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
891 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
892
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
893 //init
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
894 if (m_useNameSpace)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
895 writeString("// QT_BEGIN_NAMESPACE\n\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
896 if (m_root) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
897 writeString("extern(C) bool qtd_register_resource_data(int version_, ubyte *tree, ubyte *name, ubyte *data);\n\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
898 writeString("extern(C) bool qtd_unregister_resource_data(int version_, ubyte *tree, ubyte *name, ubyte *data);\n\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
899 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
900 if (m_useNameSpace)
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
901 writeString("// QT_END_NAMESPACE\n\n\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
902 QString initResources = QLatin1String("qtd_init_resources");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
903 initResources += initName;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
904 writeString("extern(C) int ");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
905 writeMangleNamespaceFunction(initResources.toLatin1());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
906 writeString("()\n{\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
907
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
908 if (m_root) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
909 writeString(" ");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
910 writeString("qtd_register_resource_data(0x01, qt_resource_struct.ptr, "
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
911 "qt_resource_name.ptr, qt_resource_data.ptr);\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
912 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
913 writeString(" return 1;\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
914 writeString("}\n\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
915
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
916 //cleanup
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
917 QString cleanResources = QLatin1String("qtd_cleanup_resources");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
918 cleanResources += initName;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
919 writeString("extern(C) int ");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
920 writeMangleNamespaceFunction(cleanResources.toLatin1());
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
921 writeString("()\n{\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
922 if (m_root) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
923 writeString(" ");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
924 writeString("qtd_unregister_resource_data(0x01, qt_resource_struct.ptr, "
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
925 "qt_resource_name.ptr, qt_resource_data.ptr);\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
926 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
927 writeString(" return 1;\n");
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
928 writeString("}\n\n");
61
a2871e6b8b15 drcc: automatic initialization of resources with program start (disabled with option -no-static-initialize)
SokoL_SD
parents: 57
diff changeset
929
a2871e6b8b15 drcc: automatic initialization of resources with program start (disabled with option -no-static-initialize)
SokoL_SD
parents: 57
diff changeset
930 if(staticInitialize())
a2871e6b8b15 drcc: automatic initialization of resources with program start (disabled with option -no-static-initialize)
SokoL_SD
parents: 57
diff changeset
931 {
a2871e6b8b15 drcc: automatic initialization of resources with program start (disabled with option -no-static-initialize)
SokoL_SD
parents: 57
diff changeset
932 writeString("static this() \n{\n ");
a2871e6b8b15 drcc: automatic initialization of resources with program start (disabled with option -no-static-initialize)
SokoL_SD
parents: 57
diff changeset
933 writeMangleNamespaceFunction(initResources.toLatin1());
a2871e6b8b15 drcc: automatic initialization of resources with program start (disabled with option -no-static-initialize)
SokoL_SD
parents: 57
diff changeset
934 writeString("();\n}\n\n");
a2871e6b8b15 drcc: automatic initialization of resources with program start (disabled with option -no-static-initialize)
SokoL_SD
parents: 57
diff changeset
935
a2871e6b8b15 drcc: automatic initialization of resources with program start (disabled with option -no-static-initialize)
SokoL_SD
parents: 57
diff changeset
936 writeString("static ~this() \n{\n ");
a2871e6b8b15 drcc: automatic initialization of resources with program start (disabled with option -no-static-initialize)
SokoL_SD
parents: 57
diff changeset
937 writeMangleNamespaceFunction(cleanResources.toLatin1());
a2871e6b8b15 drcc: automatic initialization of resources with program start (disabled with option -no-static-initialize)
SokoL_SD
parents: 57
diff changeset
938 writeString("();\n}\n\n");
a2871e6b8b15 drcc: automatic initialization of resources with program start (disabled with option -no-static-initialize)
SokoL_SD
parents: 57
diff changeset
939 }
57
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
940 } else if (m_format == Binary) {
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
941 int i = 4;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
942 char *p = m_out.data();
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
943 p[i++] = 0; // 0x01
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
944 p[i++] = 0;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
945 p[i++] = 0;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
946 p[i++] = 1;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
947
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
948 p[i++] = (m_treeOffset >> 24) & 0xff;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
949 p[i++] = (m_treeOffset >> 16) & 0xff;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
950 p[i++] = (m_treeOffset >> 8) & 0xff;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
951 p[i++] = (m_treeOffset >> 0) & 0xff;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
952
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
953 p[i++] = (m_dataOffset >> 24) & 0xff;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
954 p[i++] = (m_dataOffset >> 16) & 0xff;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
955 p[i++] = (m_dataOffset >> 8) & 0xff;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
956 p[i++] = (m_dataOffset >> 0) & 0xff;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
957
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
958 p[i++] = (m_namesOffset >> 24) & 0xff;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
959 p[i++] = (m_namesOffset >> 16) & 0xff;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
960 p[i++] = (m_namesOffset >> 8) & 0xff;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
961 p[i++] = (m_namesOffset >> 0) & 0xff;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
962 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
963 return true;
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
964 }
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
965
7be693ea7070 drcc, resource compiler, see interview demo
eldar
parents:
diff changeset
966 QT_END_NAMESPACE