1022b0d111
The Out-only converters shouldn't need to implement loadFile(), as it shouldn't be called - a converter is not used for input unless it says it supports input. At the same time, provide the "ground state" implementations for optionsHelp(), outputOptions() and probeFile() to save the trivial implementations the need to duplicate one another. In the process, make the handling of loadFile()'s outputConverter more consistent among those that do implement it. Always set outputConverter if it's initially null (the caller does assert this). Pick-to: 6.6 6.5 Task-number: QTBUG-111228 Change-Id: I856d12c791d1f8e0accdb7dd1412d493117b2302 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
100 lines
2.3 KiB
C++
100 lines
2.3 KiB
C++
// Copyright (C) 2018 Intel Corporation.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
|
|
|
#include "textconverter.h"
|
|
|
|
#include <QFile>
|
|
#include <QTextStream>
|
|
|
|
using namespace Qt::StringLiterals;
|
|
|
|
static void dumpVariant(QTextStream &out, const QVariant &v)
|
|
{
|
|
switch (v.userType()) {
|
|
case QMetaType::QVariantList: {
|
|
const QVariantList list = v.toList();
|
|
for (const QVariant &item : list)
|
|
dumpVariant(out, item);
|
|
break;
|
|
}
|
|
|
|
case QMetaType::QString: {
|
|
const QStringList list = v.toStringList();
|
|
for (const QString &s : list)
|
|
out << s << Qt::endl;
|
|
break;
|
|
}
|
|
|
|
case QMetaType::QVariantMap: {
|
|
const QVariantMap map = v.toMap();
|
|
for (auto it = map.begin(); it != map.end(); ++it) {
|
|
out << it.key() << " => ";
|
|
dumpVariant(out, it.value());
|
|
}
|
|
break;
|
|
}
|
|
|
|
case QMetaType::Nullptr:
|
|
out << "(null)" << Qt::endl;
|
|
break;
|
|
|
|
default:
|
|
out << v.toString() << Qt::endl;
|
|
break;
|
|
}
|
|
}
|
|
|
|
QString TextConverter::name() const
|
|
{
|
|
return "text"_L1;
|
|
}
|
|
|
|
Converter::Directions TextConverter::directions() const
|
|
{
|
|
return Direction::InOut;
|
|
}
|
|
|
|
bool TextConverter::probeFile(QIODevice *f) const
|
|
{
|
|
if (QFile *file = qobject_cast<QFile *>(f))
|
|
return file->fileName().endsWith(".txt"_L1);
|
|
return false;
|
|
}
|
|
|
|
QVariant TextConverter::loadFile(QIODevice *f, const Converter *&outputConverter) const
|
|
{
|
|
if (!outputConverter)
|
|
outputConverter = this;
|
|
|
|
QVariantList list;
|
|
QTextStream in(f);
|
|
QString line;
|
|
while (!in.atEnd()) {
|
|
in.readLineInto(&line);
|
|
bool ok;
|
|
|
|
if (qint64 v = line.toLongLong(&ok); ok)
|
|
list.append(v);
|
|
else if (double d = line.toDouble(&ok); ok)
|
|
list.append(d);
|
|
else
|
|
list.append(line);
|
|
}
|
|
|
|
return list;
|
|
}
|
|
|
|
void TextConverter::saveFile(QIODevice *f, const QVariant &contents,
|
|
const QStringList &options) const
|
|
{
|
|
if (!options.isEmpty()) {
|
|
qFatal("Unknown option '%s' to text output. This format has no options.",
|
|
qPrintable(options.first()));
|
|
}
|
|
|
|
QTextStream out(f);
|
|
dumpVariant(out, contents);
|
|
}
|
|
|
|
static TextConverter textConverter;
|