Warning, file /system/dolphin/src/views/dolphinremoteencoding.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002  * SPDX-FileCopyrightText: 2009 Rahman Duran <rahman.duran@gmail.com>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 /*
0008  * This code is largely based on the kremoteencodingplugin
0009  * SPDX-FileCopyrightText: 2003 Thiago Macieira <thiago.macieira@kdemail.net>
0010  * Distributed under the same terms.
0011  */
0012 
0013 #include "dolphinremoteencoding.h"
0014 
0015 #include "dolphindebug.h"
0016 #include "dolphinviewactionhandler.h"
0017 
0018 #include <KActionCollection>
0019 #include <KActionMenu>
0020 #include <KCharsets>
0021 #include <KConfig>
0022 #include <KConfigGroup>
0023 #include <KLocalizedString>
0024 #include <KProtocolInfo>
0025 #include <KProtocolManager>
0026 
0027 #include <QDBusConnection>
0028 #include <QDBusMessage>
0029 #include <QMenu>
0030 
0031 #define DATA_KEY QStringLiteral("Charset")
0032 
0033 DolphinRemoteEncoding::DolphinRemoteEncoding(QObject *parent, DolphinViewActionHandler *actionHandler)
0034     : QObject(parent)
0035     , m_actionHandler(actionHandler)
0036     , m_loaded(false)
0037     , m_idDefault(0)
0038 {
0039     m_menu = new KActionMenu(QIcon::fromTheme(QStringLiteral("character-set")), i18n("Select Remote Charset"), this);
0040     m_actionHandler->actionCollection()->addAction(QStringLiteral("change_remote_encoding"), m_menu);
0041     connect(m_menu->menu(), &QMenu::aboutToShow, this, &DolphinRemoteEncoding::slotAboutToShow);
0042 
0043     m_menu->setEnabled(false);
0044     m_menu->setPopupMode(QToolButton::InstantPopup);
0045 }
0046 
0047 DolphinRemoteEncoding::~DolphinRemoteEncoding()
0048 {
0049 }
0050 
0051 void DolphinRemoteEncoding::slotReload()
0052 {
0053     loadSettings();
0054 }
0055 
0056 void DolphinRemoteEncoding::loadSettings()
0057 {
0058     m_loaded = true;
0059     m_encodingDescriptions = KCharsets::charsets()->descriptiveEncodingNames();
0060 
0061     fillMenu();
0062 }
0063 
0064 void DolphinRemoteEncoding::slotAboutToOpenUrl()
0065 {
0066     QUrl oldURL = m_currentURL;
0067     m_currentURL = m_actionHandler->currentView()->url();
0068 
0069     if (m_currentURL.scheme() != oldURL.scheme()) {
0070         // This plugin works on ftp, fish, etc.
0071         // everything whose type is T_FILESYSTEM except for local files
0072         if (!m_currentURL.isLocalFile() && KProtocolManager::outputType(m_currentURL) == KProtocolInfo::T_FILESYSTEM) {
0073             m_menu->setEnabled(true);
0074             loadSettings();
0075         } else {
0076             m_menu->setEnabled(false);
0077         }
0078         return;
0079     }
0080 
0081     if (m_currentURL.host() != oldURL.host()) {
0082         updateMenu();
0083     }
0084 }
0085 
0086 void DolphinRemoteEncoding::fillMenu()
0087 {
0088     QMenu *menu = m_menu->menu();
0089     menu->clear();
0090 
0091     menu->addAction(i18n("Default"), this, &DolphinRemoteEncoding::slotDefault)->setCheckable(true);
0092     for (int i = 0; i < m_encodingDescriptions.size(); i++) {
0093         QAction *action = new QAction(m_encodingDescriptions.at(i), this);
0094         action->setCheckable(true);
0095         action->setData(i);
0096         menu->addAction(action);
0097     }
0098     menu->addSeparator();
0099 
0100     menu->addAction(i18n("Reload"), this, &DolphinRemoteEncoding::slotReload);
0101     m_idDefault = m_encodingDescriptions.size() + 2;
0102 
0103     connect(menu, &QMenu::triggered, this, &DolphinRemoteEncoding::slotItemSelected);
0104 }
0105 
0106 void DolphinRemoteEncoding::updateMenu()
0107 {
0108     if (!m_loaded) {
0109         loadSettings();
0110     }
0111 
0112     // uncheck everything
0113     for (int i = 0; i < m_menu->menu()->actions().count(); i++) {
0114         m_menu->menu()->actions().at(i)->setChecked(false);
0115     }
0116 
0117     const QString charset = KCharsets::charsets()->descriptionForEncoding(KProtocolManager::charsetFor(m_currentURL));
0118     if (!charset.isEmpty()) {
0119         int id = 0;
0120         bool isFound = false;
0121         for (int i = 0; i < m_encodingDescriptions.size(); i++) {
0122             if (m_encodingDescriptions.at(i) == charset) {
0123                 isFound = true;
0124                 id = i;
0125                 break;
0126             }
0127         }
0128 
0129         qCDebug(DolphinDebug) << "URL=" << m_currentURL << " charset=" << charset;
0130 
0131         if (!isFound) {
0132             qCWarning(DolphinDebug) << "could not find entry for charset=" << charset;
0133         } else {
0134             m_menu->menu()->actions().at(id)->setChecked(true);
0135         }
0136     } else {
0137         m_menu->menu()->actions().at(m_idDefault)->setChecked(true);
0138     }
0139 }
0140 
0141 void DolphinRemoteEncoding::slotAboutToShow()
0142 {
0143     if (!m_loaded) {
0144         loadSettings();
0145     }
0146     updateMenu();
0147 }
0148 
0149 void DolphinRemoteEncoding::slotItemSelected(QAction *action)
0150 {
0151     if (action) {
0152         int id = action->data().toInt();
0153 
0154         KConfig config(QLatin1String("kio_%1rc").arg(m_currentURL.scheme()));
0155         QString host = m_currentURL.host();
0156         if (m_menu->menu()->actions().at(id)->isChecked()) {
0157             QString charset = KCharsets::charsets()->encodingForName(m_encodingDescriptions.at(id));
0158             KConfigGroup cg(&config, host);
0159             cg.writeEntry(DATA_KEY, charset);
0160             config.sync();
0161 
0162             // Update the io-slaves...
0163             updateView();
0164         }
0165     }
0166 }
0167 
0168 void DolphinRemoteEncoding::slotDefault()
0169 {
0170     // We have no choice but delete all higher domain level
0171     // settings here since it affects what will be matched.
0172     KConfig config(QLatin1String("kio_%1rc").arg(m_currentURL.scheme()));
0173 
0174     QStringList partList = m_currentURL.host().split(QLatin1Char('.'), Qt::SkipEmptyParts);
0175     if (!partList.isEmpty()) {
0176         partList.erase(partList.begin());
0177 
0178         QStringList domains;
0179         // Remove the exact name match...
0180         domains << m_currentURL.host();
0181 
0182         while (!partList.isEmpty()) {
0183             if (partList.count() == 2) {
0184                 if (partList[0].length() <= 2 && partList[1].length() == 2) {
0185                     break;
0186                 }
0187             }
0188 
0189             if (partList.count() == 1) {
0190                 break;
0191             }
0192 
0193             domains << partList.join(QLatin1Char('.'));
0194             partList.erase(partList.begin());
0195         }
0196 
0197         for (QStringList::const_iterator it = domains.constBegin(); it != domains.constEnd(); ++it) {
0198             qCDebug(DolphinDebug) << "Domain to remove: " << *it;
0199             if (config.hasGroup(*it)) {
0200                 config.deleteGroup(*it);
0201             } else if (config.group(QString()).hasKey(*it)) {
0202                 config.group(QString()).deleteEntry(*it); // don't know what group name is supposed to be XXX
0203             }
0204         }
0205     }
0206     config.sync();
0207 
0208     // Update the io-slaves.
0209     updateView();
0210 }
0211 
0212 void DolphinRemoteEncoding::updateView()
0213 {
0214     QDBusMessage message =
0215         QDBusMessage::createSignal(QStringLiteral("/KIO/Scheduler"), QStringLiteral("org.kde.KIO.Scheduler"), QStringLiteral("reparseSlaveConfiguration"));
0216     message << QString();
0217     QDBusConnection::sessionBus().send(message);
0218 
0219     // Reload the page with the new charset
0220     m_actionHandler->currentView()->setUrl(m_currentURL);
0221     m_actionHandler->currentView()->reload();
0222 }
0223 
0224 #include "moc_dolphinremoteencoding.cpp"