File indexing completed on 2024-05-05 16:13:20

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 }