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"