// Copyright (C) 2018 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include "debugtextdumper.h" #include #include using namespace Qt::StringLiterals; // Static instance is declared in datastreamconverter.cpp, since it uses it. static QString dumpVariant(const QVariant &v, const QString &indent = "\n"_L1) { QString result; QString indented = indent + " "_L1; int type = v.userType(); if (type == qMetaTypeId() || type == QMetaType::QVariantMap) { const auto map = (type == QMetaType::QVariantMap) ? VariantOrderedMap(v.toMap()) : qvariant_cast(v); result = "Map {"_L1; for (const auto &pair : map) { result += indented + dumpVariant(pair.first, indented); result.chop(1); // remove comma result += " => "_L1 + dumpVariant(pair.second, indented); } result.chop(1); // remove comma result += indent + "},"_L1; } else if (type == QMetaType::QVariantList) { const QVariantList list = v.toList(); result = "List ["_L1; for (const auto &item : list) result += indented + dumpVariant(item, indented); result.chop(1); // remove comma result += indent + "],"_L1; } else { QDebug debug(&result); debug.nospace() << v << ','; } return result; } QString DebugTextDumper::name() const { return "debugtext-dump"_L1; } Converter::Directions DebugTextDumper::directions() const { return Direction::Out; } Converter::Options DebugTextDumper::outputOptions() const { return SupportsArbitraryMapKeys; } const char *DebugTextDumper::optionsHelp() const { return nullptr; } bool DebugTextDumper::probeFile(QIODevice *f) const { Q_UNUSED(f); return false; } QVariant DebugTextDumper::loadFile(QIODevice *f, const Converter *&outputConverter) const { Q_UNREACHABLE(); Q_UNUSED(f); Q_UNUSED(outputConverter); return QVariant(); } void DebugTextDumper::saveFile(QIODevice *f, const QVariant &contents, const QStringList &options) const { Q_UNUSED(options); QString s = dumpVariant(contents); s[s.size() - 1] = u'\n'; // replace the comma with newline QTextStream out(f); out << s; }