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 test suite of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:GPL-EXCEPT$
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 General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
21 ** included in the packaging of this file. Please review the following
22 ** information to ensure the GNU General Public License requirements will
23 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
24 **
25 ** $QT_END_LICENSE$
26 **
27 ****************************************************************************/
28
29 #include <qfile.h>
30 #include <qjsonarray.h>
31 #include <qjsondocument.h>
32 #include <qjsonobject.h>
33 #include <qhashfunctions.h>
34 #include <qstringlist.h>
35 #include <cstdlib>
36
readFromDevice(QIODevice * device,QJsonArray * allMetaObjects)37 static bool readFromDevice(QIODevice *device, QJsonArray *allMetaObjects)
38 {
39 const QByteArray contents = device->readAll();
40 if (contents.isEmpty())
41 return true;
42
43 QJsonParseError error {};
44 QJsonDocument metaObjects = QJsonDocument::fromJson(contents, &error);
45 if (error.error != QJsonParseError::NoError) {
46 fprintf(stderr, "%s at %d\n", error.errorString().toUtf8().constData(), error.offset);
47 return false;
48 }
49
50 allMetaObjects->append(metaObjects.object());
51 return true;
52 }
53
collectJson(const QStringList & jsonFiles,const QString & outputFile)54 int collectJson(const QStringList &jsonFiles, const QString &outputFile)
55 {
56 qSetGlobalQHashSeed(0);
57
58 QFile output;
59 if (outputFile.isEmpty()) {
60 if (!output.open(stdout, QIODevice::WriteOnly)) {
61 fprintf(stderr, "Error opening stdout for writing\n");
62 return EXIT_FAILURE;
63 }
64 } else {
65 output.setFileName(outputFile);
66 if (!output.open(QIODevice::WriteOnly)) {
67 fprintf(stderr, "Error opening %s for writing\n", qPrintable(outputFile));
68 return EXIT_FAILURE;
69 }
70 }
71
72 QJsonArray allMetaObjects;
73 if (jsonFiles.isEmpty()) {
74 QFile f;
75 if (!f.open(stdin, QIODevice::ReadOnly)) {
76 fprintf(stderr, "Error opening stdin for reading\n");
77 return EXIT_FAILURE;
78 }
79
80 if (!readFromDevice(&f, &allMetaObjects)) {
81 fprintf(stderr, "Error parsing data from stdin\n");
82 return EXIT_FAILURE;
83 }
84 }
85
86 for (const QString &jsonFile: jsonFiles) {
87 QFile f(jsonFile);
88 if (!f.open(QIODevice::ReadOnly)) {
89 fprintf(stderr, "Error opening %s for reading\n", qPrintable(jsonFile));
90 return EXIT_FAILURE;
91 }
92
93 if (!readFromDevice(&f, &allMetaObjects)) {
94 fprintf(stderr, "Error parsing %s\n", qPrintable(jsonFile));
95 return EXIT_FAILURE;
96 }
97 }
98
99 QJsonDocument doc(allMetaObjects);
100 output.write(doc.toJson());
101
102 return EXIT_SUCCESS;
103 }
104