Use QString's characterset conversion functions when possible

This commit is contained in:
Martchus 2019-06-01 12:47:08 +02:00
parent 081fb816b5
commit 9edfa63e7f
1 changed files with 64 additions and 34 deletions

View File

@ -9,6 +9,7 @@
#include <tagparser/signature.h> #include <tagparser/signature.h>
#include <tagparser/tag.h> #include <tagparser/tag.h>
#include <c++utilities/conversion/binaryconversion.h>
#include <c++utilities/io/path.h> #include <c++utilities/io/path.h>
#include <QAbstractItemModel> #include <QAbstractItemModel>
@ -46,60 +47,89 @@ const char *textEncodingToCodecName(TagTextEncoding textEncoding)
QString tagValueToQString(const TagValue &value) QString tagValueToQString(const TagValue &value)
{ {
if (!value.isEmpty()) { if (value.isEmpty()) {
switch (value.type()) { return QString();
case TagDataType::Text: }
return dataToQString(value.dataPointer(), value.dataSize(), value.dataEncoding()); switch (value.type()) {
case TagDataType::Integer: case TagDataType::Text:
return QStringLiteral("%1").arg(value.toInteger()); return dataToQString(value.dataPointer(), value.dataSize(), value.dataEncoding());
case TagDataType::StandardGenreIndex: case TagDataType::Integer:
case TagDataType::TimeSpan: return QString::number(value.toInteger());
case TagDataType::PositionInSet: case TagDataType::StandardGenreIndex:
return QString::fromUtf8(value.toString().c_str()); case TagDataType::TimeSpan:
default:; case TagDataType::PositionInSet:
} return QString::fromStdString(value.toString());
default:;
} }
return QString(); return QString();
} }
QString dataToQString(const char *data, size_t dataSize, TagTextEncoding encoding) QString dataToQString(const char *data, size_t dataSize, TagTextEncoding encoding)
{ {
if (data && dataSize) { if (!data || !dataSize) {
const char *codecName = textEncodingToCodecName(encoding); return QString();
auto *codec = QTextCodec::codecForName(codecName);
if (!codec) {
codec = QTextCodec::codecForLocale();
}
return codec->toUnicode(data, static_cast<int>(dataSize));
} }
return QString();
switch (encoding) {
case TagTextEncoding::Latin1:
case TagTextEncoding::Unspecified:
return QString::fromLatin1(data, static_cast<int>(dataSize));
case TagTextEncoding::Utf8:
return QString::fromUtf8(data, static_cast<int>(dataSize));
#if defined(CONVERSION_UTILITIES_BYTE_ORDER_LITTLE_ENDIAN)
case TagTextEncoding::Utf16LittleEndian:
#else
case TagTextEncoding::Utf16BigEndian:
#endif
return QString::fromUtf16(reinterpret_cast<const ushort *>(data), static_cast<int>(dataSize / (sizeof(ushort) / sizeof(char))));
default:;
}
const char *const codecName = textEncodingToCodecName(encoding);
const auto *codec = QTextCodec::codecForName(codecName);
if (!codec) {
codec = QTextCodec::codecForLocale();
}
return codec->toUnicode(data, static_cast<int>(dataSize));
} }
QString stringToQString(const string &value, TagTextEncoding textEncoding) QString stringToQString(const string &value, TagTextEncoding textEncoding)
{ {
if (!value.empty()) { return dataToQString(value.data(), value.size(), textEncoding);
const char *codecName = textEncodingToCodecName(textEncoding);
auto *codec = QTextCodec::codecForName(codecName);
if (!codec) {
codec = QTextCodec::codecForLocale();
}
return codec->toUnicode(value.c_str());
}
return QString();
} }
string qstringToString(const QString &value, TagTextEncoding textEncoding) string qstringToString(const QString &value, TagTextEncoding textEncoding)
{ {
if (!value.isEmpty()) { if (value.isEmpty()) {
const char *codecName = textEncodingToCodecName(textEncoding); return string();
}
QByteArray encodedString;
switch (textEncoding) {
case TagTextEncoding::Latin1:
case TagTextEncoding::Unspecified:
encodedString = value.toLatin1();
break;
case TagTextEncoding::Utf8:
encodedString = value.toUtf8();
break;
#if defined(CONVERSION_UTILITIES_BYTE_ORDER_LITTLE_ENDIAN)
case TagTextEncoding::Utf16LittleEndian:
#else
case TagTextEncoding::Utf16BigEndian:
#endif
encodedString = QByteArray(
reinterpret_cast<const char *>(value.utf16()), static_cast<int>(value.size() * static_cast<int>(sizeof(ushort) / sizeof(char))));
break;
default: {
const char *const codecName = textEncodingToCodecName(textEncoding);
auto *codec = QTextCodec::codecForName(codecName); auto *codec = QTextCodec::codecForName(codecName);
if (!codec) { if (!codec) {
codec = QTextCodec::codecForLocale(); codec = QTextCodec::codecForLocale();
} }
const auto encodedString = codec->fromUnicode(value); encodedString = codec->fromUnicode(value);
return string(encodedString.data(), static_cast<string::size_type>(encodedString.size()));
} }
return string(); }
return string(encodedString.data(), static_cast<string::size_type>(encodedString.size()));
} }
TagValue qstringToTagValue(const QString &value, TagTextEncoding textEncoding) TagValue qstringToTagValue(const QString &value, TagTextEncoding textEncoding)