1// Copyright (C) 2018 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
4#include <qfile.h>
5#include <qjsonarray.h>
6#include <qjsondocument.h>
7#include <qjsonobject.h>
8#include <qhashfunctions.h>
9#include <qstringlist.h>
10#include <cstdlib>
11
12static bool readFromFile(QFile *device, QJsonArray *allMetaObjects)
13{
14 const QByteArray contents = device->readAll();
15 if (contents.isEmpty()) {
16 fprintf(stderr, format: "%s:0: metatypes input file is empty\n", qPrintable(device->fileName()));
17 return false;
18 }
19
20 QJsonParseError error {};
21 QJsonDocument metaObjects = QJsonDocument::fromJson(json: contents, error: &error);
22 if (error.error != QJsonParseError::NoError) {
23 fprintf(stderr, format: "%s:%d: %s\n", qPrintable(device->fileName()), error.offset,
24 qPrintable(error.errorString()));
25 return false;
26 }
27
28 allMetaObjects->append(value: metaObjects.object());
29 return true;
30}
31
32int collectJson(const QStringList &jsonFiles, const QString &outputFile, bool skipStdIn)
33{
34 QHashSeed::setDeterministicGlobalSeed();
35
36 QFile output;
37 if (outputFile.isEmpty()) {
38 if (!output.open(stdout, ioFlags: QIODevice::WriteOnly)) {
39 fprintf(stderr, format: "Error opening stdout for writing: %s\n",
40 qPrintable(output.errorString()));
41 return EXIT_FAILURE;
42 }
43 } else {
44 output.setFileName(outputFile);
45 if (!output.open(flags: QIODevice::WriteOnly)) {
46 fprintf(stderr, format: "%s: Cannot open file for writing: %s\n", qPrintable(outputFile),
47 qPrintable(output.errorString()));
48 return EXIT_FAILURE;
49 }
50 }
51
52 QJsonArray allMetaObjects;
53 if (jsonFiles.isEmpty() && !skipStdIn) {
54 QFile f;
55 if (!f.open(stdin, ioFlags: QIODevice::ReadOnly)) {
56 fprintf(stderr, format: "Error opening stdin for reading: %s\n", qPrintable(f.errorString()));
57 return EXIT_FAILURE;
58 }
59
60 if (!readFromFile(device: &f, allMetaObjects: &allMetaObjects))
61 return EXIT_FAILURE;
62 }
63
64 QStringList jsonFilesSorted = jsonFiles;
65 jsonFilesSorted.sort();
66 for (const QString &jsonFile : std::as_const(t&: jsonFilesSorted)) {
67 QFile f(jsonFile);
68 if (!f.open(flags: QIODevice::ReadOnly)) {
69 fprintf(stderr, format: "%s: Cannot open file for reading: %s\n", qPrintable(jsonFile),
70 qPrintable(f.errorString()));
71 return EXIT_FAILURE;
72 }
73
74 if (!readFromFile(device: &f, allMetaObjects: &allMetaObjects))
75 return EXIT_FAILURE;
76 }
77
78 QJsonDocument doc(allMetaObjects);
79 output.write(data: doc.toJson());
80
81 return EXIT_SUCCESS;
82}
83

source code of qtbase/src/tools/moc/collectjson.cpp