26int main(
int argc,
char** argv)
28 QCoreApplication app(argc, argv);
29 QCoreApplication::setApplicationName(QStringLiteral(
"qplugininfo"));
30 QCoreApplication::setApplicationVersion(QStringLiteral(QT_VERSION_STR));
32 QCommandLineParser parser;
33 parser.setApplicationDescription(QStringLiteral(
"Qt plugin meta-data dumper"));
34 QCommandLineOption jsonFormatOption(QStringList() <<
"f" <<
"json-format",
35 QStringLiteral(
"Print JSON data as: indented, compact"), QStringLiteral(
"format"));
36 QCommandLineOption fullJsonOption(
"full-json",
37 QStringLiteral(
"Print the plugin metadata in JSON format"));
38 QCommandLineOption printOption(QStringList() <<
"p" << QStringLiteral(
"print"),
39 QStringLiteral(
"Print detail (iid, classname, qtinfo, userdata)"), QStringLiteral(
"detail"));
40 jsonFormatOption.setDefaultValue(QStringLiteral(
"indented"));
41 printOption.setDefaultValues(QStringList() << QStringLiteral(
"iid") << QStringLiteral(
"qtinfo") << QStringLiteral(
"userdata"));
43 parser.addOption(fullJsonOption);
44 parser.addOption(jsonFormatOption);
45 parser.addOption(printOption);
46 parser.addHelpOption();
47 parser.addVersionOption();
48 parser.addPositionalArgument(QStringLiteral(
"plugin"), QStringLiteral(
"Plug-in of which to read the meta data."), QStringLiteral(
"<plugin>"));
51 if (parser.positionalArguments().isEmpty())
54 bool fullJson = parser.isSet(fullJsonOption);
55 QJsonDocument::JsonFormat jsonFormat = parser.value(jsonFormatOption) ==
"indented" ? QJsonDocument::Indented : QJsonDocument::Compact;
56 QStringList printOptionList = parser.values(printOption);
58 if (printOptionList.contains(
"iid"))
60 if (printOptionList.contains(
"classname"))
61 print |= PrintClassName;
62 if (printOptionList.contains(
"qtinfo"))
64 if (printOptionList.contains(
"userdata"))
65 print |= PrintUserData;
68 const QStringList positionalArguments = parser.positionalArguments();
69 for (
const QString &plugin : positionalArguments) {
70 QByteArray pluginNativeName = QFile::encodeName(QDir::toNativeSeparators(plugin));
71 if (!QFile::exists(plugin)) {
72 std::cerr <<
"qtplugininfo: " << pluginNativeName.constData() <<
": No such file or directory." << std::endl;
76 if (!QLibrary::isLibrary(plugin)) {
77 std::cerr <<
"qtplugininfo: " << pluginNativeName.constData() <<
": Not a plug-in." << std::endl;
82 QPluginLoader loader(plugin);
83 QJsonObject metaData = loader.metaData();
84 if (metaData.isEmpty()) {
85 std::cerr <<
"qtplugininfo: " << pluginNativeName.constData() <<
": No plug-in meta-data found: "
86 << qPrintable(loader.errorString()) << std::endl;
91 QString iid = metaData.value(
"IID").toString();
92 QString className = metaData.value(
"className").toString();
93 QJsonValue debug = metaData.value(
"debug");
94 int version = metaData.value(
"version").toInt();
95 QJsonValue userData = metaData.value(
"MetaData");
97 if ((version >> 16) != (QT_VERSION >> 16)) {
98 std::cerr <<
"qtplugininfo: " << pluginNativeName.constData()
99 <<
": Qt version mismatch - got major version " << (version >> 16)
100 <<
", expected " << (QT_VERSION >> 16) << std::endl;
104 if (iid.isEmpty() || className.isEmpty() || debug.isNull()) {
105 std::cerr <<
"qtplugininfo: " << pluginNativeName.constData() <<
": invalid metadata, missing required fields:";
108 if (className.isEmpty())
109 std::cerr <<
" className";
111 std::cerr <<
" debug";
112 std::cerr << std::endl;
117 if (parser.positionalArguments().size() != 1)
118 std::cout << pluginNativeName.constData() <<
": ";
120 std::cout << QJsonDocument(metaData).toJson(jsonFormat).constData();
121 if (jsonFormat == QJsonDocument::Compact)
122 std::cout << std::endl;
124 if (print & PrintIID)
125 std::cout <<
"IID \"" << qPrintable(iid) <<
"\" ";
126 if (print & PrintClassName)
127 std::cout <<
"class " << qPrintable(className) <<
' ';
128 if (print & PrintQtInfo)
129 std::cout <<
"Qt " << (version >> 16) <<
'.' << ((version >> 8) & 0xFF) <<
'.' << (version & 0xFF)
130 << (debug.toBool() ?
" (debug)" :
" (release)");
131 std::cout << std::endl;
132 if (print & PrintUserData) {
133 if (userData.isObject())
134 std::cout <<
"User Data: " << QJsonDocument(userData.toObject()).toJson().constData();
135 else if (!userData.isNull()) {
136 std::cerr <<
"qtplugininfo: " << pluginNativeName.constData() <<
": invalid metadata, user data is not a JSON object" << std::endl;