Use QString's characterset conversion functions when possible
This commit is contained in:
parent
081fb816b5
commit
9edfa63e7f
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue