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 }