1 /****************************************************************************
2 **
3 ** Copyright (C) 2018 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the Qt Assistant of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 
40 #include "collectionconfigreader.h"
41 
42 #include <QtGui/QGuiApplication>
43 
44 class QCG {
45     Q_DECLARE_TR_FUNCTIONS(QCollectionGenerator)
46 };
47 
raiseErrorWithLine()48 void CollectionConfigReader::raiseErrorWithLine()
49 {
50     raiseError(QCG::tr("Unknown token at line %1.").arg(lineNumber()));
51 }
52 
readData(const QByteArray & contents)53 void CollectionConfigReader::readData(const QByteArray &contents)
54 {
55     m_enableFilterFunctionality = true;
56     m_hideFilterFunctionality = true;
57     m_enableAddressBar = true;
58     m_hideAddressBar = true;
59     m_enableDocumentationManager = true;
60     m_enableFullTextSearchFallback = false;
61 
62     addData(contents);
63     while (!atEnd()) {
64         readNext();
65         if (isStartElement()) {
66             if (name() == QLatin1String("QHelpCollectionProject")
67                 && attributes().value(QLatin1String("version")) == QLatin1String("1.0"))
68                 readConfig();
69             else
70                 raiseError(QCG::tr("Unknown token at line %1. "
71                                    "Expected \"QtHelpCollectionProject\".")
72                            .arg(lineNumber()));
73         }
74     }
75 }
76 
readConfig()77 void CollectionConfigReader::readConfig()
78 {
79     bool ok = false;
80     while (!atEnd()) {
81         readNext();
82         if (isStartElement()) {
83             if (name() == QLatin1String("assistant"))
84                 readAssistantSettings();
85             else if (name() == QLatin1String("docFiles"))
86                 readDocFiles();
87             else
88                 raiseErrorWithLine();
89         } else if (isEndElement() && name() == QLatin1String("QHelpCollectionProject")) {
90             ok = true;
91         }
92     }
93     if (!ok && !hasError())
94         raiseError(QCG::tr("Missing end tags."));
95 }
96 
readAssistantSettings()97 void CollectionConfigReader::readAssistantSettings()
98 {
99     while (!atEnd()) {
100         readNext();
101         if (isStartElement()) {
102             if (name() == QLatin1String("title")) {
103                 m_title = readElementText();
104             } else if (name() == QLatin1String("homePage")) {
105                 m_homePage = readElementText();
106             } else if (name() == QLatin1String("startPage")) {
107                 m_startPage = readElementText();
108             } else if (name() == QLatin1String("currentFilter")) {
109                 m_currentFilter = readElementText();
110             } else if (name() == QLatin1String("applicationIcon")) {
111                 m_applicationIcon = readElementText();
112             } else if (name() == QLatin1String("enableFilterFunctionality")) {
113                 if (attributes().value(QLatin1String("visible")) == QLatin1String("true"))
114                     m_hideFilterFunctionality = false;
115                 if (readElementText() == QLatin1String("false"))
116                     m_enableFilterFunctionality = false;
117             } else if (name() == QLatin1String("enableDocumentationManager")) {
118                 if (readElementText() == QLatin1String("false"))
119                     m_enableDocumentationManager = false;
120             } else if (name() == QLatin1String("enableAddressBar")) {
121                 if (attributes().value(QLatin1String("visible")) == QLatin1String("true"))
122                     m_hideAddressBar = false;
123                 if (readElementText() == QLatin1String("false"))
124                     m_enableAddressBar = false;
125             } else if (name() == QLatin1String("aboutMenuText")) {
126                 readMenuTexts();
127             } else if (name() == QLatin1String("aboutDialog")) {
128                 readAboutDialog();
129             } else if (name() == "cacheDirectory") {
130                 m_cacheDirRelativeToCollection =
131                     attributes().value(QLatin1String("base"))
132                     == QLatin1String("collection");
133                 m_cacheDirectory = readElementText();
134             } else if (name() == QLatin1String("enableFullTextSearchFallback")) {
135                 if (readElementText() == QLatin1String("true"))
136                     m_enableFullTextSearchFallback = true;
137             } else {
138                 raiseErrorWithLine();
139             }
140         } else if (isEndElement() && name() == QLatin1String("assistant")) {
141             break;
142         }
143     }
144 }
145 
readMenuTexts()146 void CollectionConfigReader::readMenuTexts()
147 {
148     while (!atEnd()) {
149         readNext();
150         if (isStartElement()) {
151             if (name() == QLatin1String("text")) {
152                 QString lang = attributes().value(QLatin1String("language")).toString();
153                 if (lang.isEmpty())
154                     lang = QLatin1String("default");
155                 m_aboutMenuTexts.insert(lang, readElementText());
156             } else {
157                 raiseErrorWithLine();
158             }
159         } else if (isEndElement() && name() == QLatin1String("aboutMenuText")) {
160             break;
161         }
162     }
163 }
164 
readAboutDialog()165 void CollectionConfigReader::readAboutDialog()
166 {
167     while (!atEnd()) {
168         readNext();
169         if (isStartElement()) {
170             if (name() == QLatin1String("file")) {
171                 QString lang = attributes().value(QLatin1String("language")).toString();
172                 if (lang.isEmpty())
173                     lang = QLatin1String("default");
174                 m_aboutTextFiles.insert(lang, readElementText());
175             } else if (name() == QLatin1String("icon")) {
176                 m_aboutIcon = readElementText();
177             } else {
178                 raiseErrorWithLine();
179             }
180         } else if (isEndElement() && name() == QLatin1String("aboutDialog")) {
181             break;
182         }
183     }
184 }
185 
readDocFiles()186 void CollectionConfigReader::readDocFiles()
187 {
188     while (!atEnd()) {
189         readNext();
190         if (isStartElement()) {
191             if (name() == QLatin1String("generate")) {
192                 readGenerate();
193             } else if (name() == QLatin1String("register")) {
194                 readRegister();
195             } else {
196                 raiseErrorWithLine();
197             }
198         } else if (isEndElement() && name() == QLatin1String("docFiles")) {
199             break;
200         }
201     }
202 }
203 
readGenerate()204 void CollectionConfigReader::readGenerate()
205 {
206     while (!atEnd()) {
207         readNext();
208         if (isStartElement()) {
209             if (name() == QLatin1String("file"))
210                 readFiles();
211             else
212                 raiseErrorWithLine();
213         } else if (isEndElement() && name() == QLatin1String("generate")) {
214             break;
215         }
216     }
217 }
218 
readFiles()219 void CollectionConfigReader::readFiles()
220 {
221     QString input;
222     QString output;
223     while (!atEnd()) {
224         readNext();
225         if (isStartElement()) {
226             if (name() == QLatin1String("input"))
227                 input = readElementText();
228             else if (name() == QLatin1String("output"))
229                 output = readElementText();
230             else
231                 raiseErrorWithLine();
232         } else if (isEndElement() && name() == QLatin1String("file")) {
233             break;
234         }
235     }
236     if (input.isEmpty() || output.isEmpty()) {
237         raiseError(QCG::tr("Missing input or output file for help file generation."));
238         return;
239     }
240     m_filesToGenerate.insert(input, output);
241 }
242 
readRegister()243 void CollectionConfigReader::readRegister()
244 {
245     while (!atEnd()) {
246         readNext();
247         if (isStartElement()) {
248             if (name() == QLatin1String("file"))
249                 m_filesToRegister.append(readElementText());
250             else
251                 raiseErrorWithLine();
252         } else if (isEndElement() && name() == QLatin1String("register")) {
253             break;
254         }
255     }
256 }
257 
258 
259