File indexing completed on 2024-05-05 03:55:41
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 <QStringConverter> 0011 #include <QUrl> 0012 0013 class KRemoteEncodingPrivate 0014 { 0015 public: 0016 QStringDecoder m_decoder; 0017 QStringEncoder m_encoder; 0018 }; 0019 0020 KRemoteEncoding::KRemoteEncoding(const char *name) 0021 : d(new KRemoteEncodingPrivate) 0022 { 0023 setEncoding(name); 0024 } 0025 0026 KRemoteEncoding::~KRemoteEncoding() = default; 0027 0028 QString KRemoteEncoding::decode(const QByteArray &name) const 0029 { 0030 QString result = d->m_decoder.decode(name); 0031 if (d->m_encoder.encode(result) != name) 0032 // fallback in case of decoding failure 0033 { 0034 return QLatin1String(name); 0035 } 0036 0037 return result; 0038 } 0039 0040 QByteArray KRemoteEncoding::encode(const QString &name) const 0041 { 0042 QByteArray result = d->m_encoder.encode(name); 0043 if (d->m_decoder.decode(result) != name) { 0044 return name.toLatin1(); 0045 } 0046 0047 return result; 0048 } 0049 0050 QByteArray KRemoteEncoding::encode(const QUrl &url) const 0051 { 0052 return encode(url.path()); 0053 } 0054 0055 QByteArray KRemoteEncoding::directory(const QUrl &url, bool ignore_trailing_slash) const 0056 { 0057 QUrl dirUrl(url); 0058 if (ignore_trailing_slash && dirUrl.path().endsWith(QLatin1Char('/'))) { 0059 dirUrl = dirUrl.adjusted(QUrl::StripTrailingSlash); 0060 } 0061 const QString dir = dirUrl.adjusted(QUrl::RemoveFilename).path(); 0062 return encode(dir); 0063 } 0064 0065 QByteArray KRemoteEncoding::fileName(const QUrl &url) const 0066 { 0067 return encode(url.fileName()); 0068 } 0069 0070 const char *KRemoteEncoding::encoding() const 0071 { 0072 return d->m_decoder.name(); 0073 } 0074 0075 void KRemoteEncoding::setEncoding(const char *name) 0076 { 0077 d->m_decoder = QStringDecoder(name); 0078 if (!d->m_decoder.isValid()) { 0079 d->m_decoder = QStringDecoder(QStringDecoder::Utf8); 0080 } 0081 d->m_encoder = QStringEncoder(name); 0082 if (!d->m_encoder.isValid()) { 0083 d->m_encoder = QStringEncoder(QStringEncoder::Utf8); 0084 } 0085 0086 Q_ASSERT(d->m_decoder.isValid()); 0087 Q_ASSERT(d->m_encoder.isValid()); 0088 0089 /*qDebug() << "setting encoding" << d->m_decoder.name() 0090 << "for name=" << name;*/ 0091 } 0092 0093 void KRemoteEncoding::virtual_hook(int, void *) 0094 { 0095 }