File indexing completed on 2023-09-24 04:08:38
0001 /* 0002 This file is part of the KDE libraries 0003 SPDX-FileCopyrightText: 2003 Thiago Macieira <thiago.macieira@kdemail.net> 0004 0005 SPDX-License-Identifier: LGPL-2.0-only 0006 */ 0007 0008 #include "kremoteencoding.h" 0009 0010 #include <KStringHandler> 0011 #include <QTextCodec> 0012 #include <QUrl> 0013 0014 class KRemoteEncodingPrivate 0015 { 0016 public: 0017 KRemoteEncodingPrivate() 0018 : m_codec(nullptr) 0019 { 0020 } 0021 0022 QTextCodec *m_codec; 0023 QByteArray m_codeName; 0024 }; 0025 0026 KRemoteEncoding::KRemoteEncoding(const char *name) 0027 : d(new KRemoteEncodingPrivate) 0028 { 0029 setEncoding(name); 0030 } 0031 0032 KRemoteEncoding::~KRemoteEncoding() = default; 0033 0034 QString KRemoteEncoding::decode(const QByteArray &name) const 0035 { 0036 #ifdef CHECK_UTF8 0037 if (d->m_codec->mibEnum() == 106 && !KStringHandler::isUtf8(name)) { 0038 return QLatin1String(name); 0039 } 0040 #endif 0041 0042 QString result = d->m_codec->toUnicode(name); 0043 if (d->m_codec->fromUnicode(result) != name) 0044 // fallback in case of decoding failure 0045 { 0046 return QLatin1String(name); 0047 } 0048 0049 return result; 0050 } 0051 0052 QByteArray KRemoteEncoding::encode(const QString &name) const 0053 { 0054 QByteArray result = d->m_codec->fromUnicode(name); 0055 if (d->m_codec->toUnicode(result) != name) { 0056 return name.toLatin1(); 0057 } 0058 0059 return result; 0060 } 0061 0062 QByteArray KRemoteEncoding::encode(const QUrl &url) const 0063 { 0064 return encode(url.path()); 0065 } 0066 0067 QByteArray KRemoteEncoding::directory(const QUrl &url, bool ignore_trailing_slash) const 0068 { 0069 QUrl dirUrl(url); 0070 if (ignore_trailing_slash && dirUrl.path().endsWith(QLatin1Char('/'))) { 0071 dirUrl = dirUrl.adjusted(QUrl::StripTrailingSlash); 0072 } 0073 const QString dir = dirUrl.adjusted(QUrl::RemoveFilename).path(); 0074 return encode(dir); 0075 } 0076 0077 QByteArray KRemoteEncoding::fileName(const QUrl &url) const 0078 { 0079 return encode(url.fileName()); 0080 } 0081 0082 const char *KRemoteEncoding::encoding() const 0083 { 0084 // KF6 TODO: return QByteArray 0085 d->m_codeName = d->m_codec->name(); 0086 return d->m_codeName.constData(); 0087 } 0088 0089 int KRemoteEncoding::encodingMib() const 0090 { 0091 return d->m_codec->mibEnum(); 0092 } 0093 0094 void KRemoteEncoding::setEncoding(const char *name) 0095 { 0096 // don't delete codecs 0097 0098 if (name) { 0099 d->m_codec = QTextCodec::codecForName(name); 0100 } 0101 0102 if (d->m_codec == nullptr) { 0103 d->m_codec = QTextCodec::codecForMib(106); // fallback to UTF-8 0104 } 0105 0106 if (d->m_codec == nullptr) { 0107 d->m_codec = QTextCodec::codecForMib(4 /* latin-1 */); 0108 } 0109 0110 Q_ASSERT(d->m_codec); 0111 0112 /*qDebug() << "setting encoding" << d->m_codec->name() 0113 << "for name=" << name;*/ 0114 } 0115 0116 void KRemoteEncoding::virtual_hook(int, void *) 0117 { 0118 }