]> cloud.milkyroute.net Git - dolphin.git/blob - src/views/dolphinremoteencoding.cpp
Fix issues if QT_NO_CAST_FROM_ASCII is defined
[dolphin.git] / src / views / dolphinremoteencoding.cpp
1 /*
2 * SPDX-FileCopyrightText: 2009 Rahman Duran <rahman.duran@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 /*
8 * This code is largely based on the kremoteencodingplugin
9 * SPDX-FileCopyrightText: 2003 Thiago Macieira <thiago.macieira@kdemail.net>
10 * Distributed under the same terms.
11 */
12
13 #include "dolphinremoteencoding.h"
14
15 #include "dolphindebug.h"
16 #include "dolphinviewactionhandler.h"
17
18 #include <KActionCollection>
19 #include <KActionMenu>
20 #include <KCharsets>
21 #include <KConfig>
22 #include <KConfigGroup>
23 #include <KLocalizedString>
24 #include <KProtocolInfo>
25 #include <KProtocolManager>
26
27 #include <QDBusConnection>
28 #include <QDBusMessage>
29 #include <QMenu>
30
31 #define DATA_KEY QStringLiteral("Charset")
32
33 DolphinRemoteEncoding::DolphinRemoteEncoding(QObject *parent, DolphinViewActionHandler *actionHandler)
34 : QObject(parent)
35 , m_actionHandler(actionHandler)
36 , m_loaded(false)
37 , m_idDefault(0)
38 {
39 m_menu = new KActionMenu(QIcon::fromTheme(QStringLiteral("character-set")), i18n("Select Remote Charset"), this);
40 m_actionHandler->actionCollection()->addAction(QStringLiteral("change_remote_encoding"), m_menu);
41 connect(m_menu->menu(), &QMenu::aboutToShow, this, &DolphinRemoteEncoding::slotAboutToShow);
42
43 m_menu->setEnabled(false);
44 m_menu->setPopupMode(QToolButton::InstantPopup);
45 }
46
47 DolphinRemoteEncoding::~DolphinRemoteEncoding()
48 {
49 }
50
51 void DolphinRemoteEncoding::slotReload()
52 {
53 loadSettings();
54 }
55
56 void DolphinRemoteEncoding::loadSettings()
57 {
58 m_loaded = true;
59 m_encodingDescriptions = KCharsets::charsets()->descriptiveEncodingNames();
60
61 fillMenu();
62 }
63
64 void DolphinRemoteEncoding::slotAboutToOpenUrl()
65 {
66 QUrl oldURL = m_currentURL;
67 m_currentURL = m_actionHandler->currentView()->url();
68
69 if (m_currentURL.scheme() != oldURL.scheme()) {
70 // This plugin works on ftp, fish, etc.
71 // everything whose type is T_FILESYSTEM except for local files
72 if (!m_currentURL.isLocalFile() && KProtocolManager::outputType(m_currentURL) == KProtocolInfo::T_FILESYSTEM) {
73 m_menu->setEnabled(true);
74 loadSettings();
75 } else {
76 m_menu->setEnabled(false);
77 }
78 return;
79 }
80
81 if (m_currentURL.host() != oldURL.host()) {
82 updateMenu();
83 }
84 }
85
86 void DolphinRemoteEncoding::fillMenu()
87 {
88 QMenu *menu = m_menu->menu();
89 menu->clear();
90
91 menu->addAction(i18n("Default"), this, &DolphinRemoteEncoding::slotDefault)->setCheckable(true);
92 for (int i = 0; i < m_encodingDescriptions.size(); i++) {
93 QAction *action = new QAction(m_encodingDescriptions.at(i), this);
94 action->setCheckable(true);
95 action->setData(i);
96 menu->addAction(action);
97 }
98 menu->addSeparator();
99
100 menu->addAction(i18n("Reload"), this, &DolphinRemoteEncoding::slotReload);
101 m_idDefault = m_encodingDescriptions.size() + 2;
102
103 connect(menu, &QMenu::triggered, this, &DolphinRemoteEncoding::slotItemSelected);
104 }
105
106 void DolphinRemoteEncoding::updateMenu()
107 {
108 if (!m_loaded) {
109 loadSettings();
110 }
111
112 // uncheck everything
113 for (int i = 0; i < m_menu->menu()->actions().count(); i++) {
114 m_menu->menu()->actions().at(i)->setChecked(false);
115 }
116
117 const QString charset = KCharsets::charsets()->descriptionForEncoding(KProtocolManager::charsetFor(m_currentURL));
118 if (!charset.isEmpty()) {
119 int id = 0;
120 bool isFound = false;
121 for (int i = 0; i < m_encodingDescriptions.size(); i++) {
122 if (m_encodingDescriptions.at(i) == charset) {
123 isFound = true;
124 id = i;
125 break;
126 }
127 }
128
129 qCDebug(DolphinDebug) << "URL=" << m_currentURL << " charset=" << charset;
130
131 if (!isFound) {
132 qCWarning(DolphinDebug) << "could not find entry for charset=" << charset;
133 } else {
134 m_menu->menu()->actions().at(id)->setChecked(true);
135 }
136 } else {
137 m_menu->menu()->actions().at(m_idDefault)->setChecked(true);
138 }
139 }
140
141 void DolphinRemoteEncoding::slotAboutToShow()
142 {
143 if (!m_loaded) {
144 loadSettings();
145 }
146 updateMenu();
147 }
148
149 void DolphinRemoteEncoding::slotItemSelected(QAction *action)
150 {
151 if (action) {
152 int id = action->data().toInt();
153
154 KConfig config(QLatin1String("kio_%1rc").arg(m_currentURL.scheme()));
155 QString host = m_currentURL.host();
156 if (m_menu->menu()->actions().at(id)->isChecked()) {
157 QString charset = KCharsets::charsets()->encodingForName(m_encodingDescriptions.at(id));
158 KConfigGroup cg(&config, host);
159 cg.writeEntry(DATA_KEY, charset);
160 config.sync();
161
162 // Update the io-slaves...
163 updateView();
164 }
165 }
166 }
167
168 void DolphinRemoteEncoding::slotDefault()
169 {
170 // We have no choice but delete all higher domain level
171 // settings here since it affects what will be matched.
172 KConfig config(QLatin1String("kio_%1rc").arg(m_currentURL.scheme()));
173
174 QStringList partList = m_currentURL.host().split(QLatin1Char('.'), Qt::SkipEmptyParts);
175 if (!partList.isEmpty()) {
176 partList.erase(partList.begin());
177
178 QStringList domains;
179 // Remove the exact name match...
180 domains << m_currentURL.host();
181
182 while (!partList.isEmpty()) {
183 if (partList.count() == 2) {
184 if (partList[0].length() <= 2 && partList[1].length() == 2) {
185 break;
186 }
187 }
188
189 if (partList.count() == 1) {
190 break;
191 }
192
193 domains << partList.join(QLatin1Char('.'));
194 partList.erase(partList.begin());
195 }
196
197 for (QStringList::const_iterator it = domains.constBegin(); it != domains.constEnd(); ++it) {
198 qCDebug(DolphinDebug) << "Domain to remove: " << *it;
199 if (config.hasGroup(*it)) {
200 config.deleteGroup(*it);
201 } else if (config.group(QString()).hasKey(*it)) {
202 config.group(QString()).deleteEntry(*it); // don't know what group name is supposed to be XXX
203 }
204 }
205 }
206 config.sync();
207
208 // Update the io-slaves.
209 updateView();
210 }
211
212 void DolphinRemoteEncoding::updateView()
213 {
214 QDBusMessage message =
215 QDBusMessage::createSignal(QStringLiteral("/KIO/Scheduler"), QStringLiteral("org.kde.KIO.Scheduler"), QStringLiteral("reparseSlaveConfiguration"));
216 message << QString();
217 QDBusConnection::sessionBus().send(message);
218
219 // Reload the page with the new charset
220 m_actionHandler->currentView()->setUrl(m_currentURL);
221 m_actionHandler->currentView()->reload();
222 }
223
224 #include "moc_dolphinremoteencoding.cpp"