diff options
Diffstat (limited to 'konqueror/remoteencodingplugin')
5 files changed, 485 insertions, 0 deletions
diff --git a/konqueror/remoteencodingplugin/Makefile.am b/konqueror/remoteencodingplugin/Makefile.am new file mode 100644 index 000000000..e80195dcb --- /dev/null +++ b/konqueror/remoteencodingplugin/Makefile.am @@ -0,0 +1,13 @@ +INCLUDES= -I$(top_srcdir)/libkonq $(all_includes) +METASOURCES=AUTO + +kde_module_LTLIBRARIES = konq_remoteencoding.la +konq_remoteencoding_la_SOURCES = kremoteencodingplugin.cpp +konq_remoteencoding_la_LIBADD = $(top_builddir)/libkonq/libkonq.la +konq_remoteencoding_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) + +iconviewdir = $(kde_datadir)/konqiconview/kpartplugins +iconview_DATA = kremoteencodingplugin.rc kremoteencodingplugin.desktop + +listviewdir = $(kde_datadir)/konqlistview/kpartplugins +listview_DATA = kremoteencodingplugin.rc kremoteencodingplugin.desktop diff --git a/konqueror/remoteencodingplugin/kremoteencodingplugin.cpp b/konqueror/remoteencodingplugin/kremoteencodingplugin.cpp new file mode 100644 index 000000000..b771b0a09 --- /dev/null +++ b/konqueror/remoteencodingplugin/kremoteencodingplugin.cpp @@ -0,0 +1,266 @@ +/* + Copyright (c) 2003 Thiago Macieira <[email protected]> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License (LGPL) as published by the Free Software Foundation; + either version 2 of the License, or (at your option) any later + version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +/* + * This code is largely based on the UserAgent changer plugin (uachanger) + * Copyright © 2001 Dawit Alemayehu <[email protected]> + * Distributed under the same terms. + */ + +#include <kdebug.h> +#include <kaction.h> +#include <klocale.h> +#include <kglobal.h> +#include <kconfig.h> +#include <kcharsets.h> +#include <kpopupmenu.h> +#include <dcopclient.h> +#include <kgenericfactory.h> +#include <kprotocolmanager.h> +#include <kprotocolinfo.h> +#include <kio/slaveconfig.h> +#include <konq_dirpart.h> +#include <kparts/browserextension.h> + +#include "kremoteencodingplugin.h" + +#define DATA_KEY QString::fromLatin1("Charset") + +KRemoteEncodingPlugin::KRemoteEncodingPlugin(QObject * parent, + const char *name, + const QStringList &) + : KParts::Plugin(parent, name), m_loaded(false), m_idDefault(0) +{ + m_menu = new KActionMenu(i18n("Select Remote Charset"), "charset", + actionCollection(), "changeremoteencoding"); + connect(m_menu->popupMenu(), SIGNAL(aboutToShow()), + this, SLOT(slotAboutToShow())); + m_menu->setEnabled(false); + m_menu->setDelayed(false); + + m_part = dynamic_cast<KonqDirPart*>(parent); + if (m_part) + // if parent is not a KonqDirPart, our menu will never show + QObject::connect(m_part, SIGNAL(aboutToOpenURL()), + this, SLOT(slotAboutToOpenURL())); +} + +KRemoteEncodingPlugin::~KRemoteEncodingPlugin() +{ +} + +void +KRemoteEncodingPlugin::slotReload() +{ + loadSettings(); +} + +void +KRemoteEncodingPlugin::loadSettings() +{ + m_loaded = true; + + m_encodingDescriptions = KGlobal::charsets()->descriptiveEncodingNames(); + + fillMenu(); +} + +void +KRemoteEncodingPlugin::slotAboutToOpenURL() +{ + KURL oldURL = m_currentURL; + m_currentURL = m_part->url(); + + if (m_currentURL.protocol() != oldURL.protocol()) + { + // This plugin works on ftp, fish, etc. + // everything whose type is T_FILESYSTEM except for local files + if (!m_currentURL.isLocalFile() && + KProtocolInfo::outputType(m_currentURL) == KProtocolInfo::T_FILESYSTEM) + { + m_menu->setEnabled(true); + loadSettings(); + } + else + m_menu->setEnabled(false); + + return; + } + + if (m_currentURL.host() != oldURL.host()) + updateMenu(); +} + +void +KRemoteEncodingPlugin::fillMenu() +{ + KPopupMenu *menu = m_menu->popupMenu(); + menu->clear(); + + QStringList::ConstIterator it; + int count = 0; + for (it = m_encodingDescriptions.begin(); it != m_encodingDescriptions.end(); ++it) + menu->insertItem(*it, this, SLOT(slotItemSelected(int)), 0, ++count); + menu->insertSeparator(); + + menu->insertItem(i18n("Reload"), this, SLOT(slotReload()), 0, ++count); + menu->insertItem(i18n("Default"), this, SLOT(slotDefault()), 0, ++count); + m_idDefault = count; +} + +void +KRemoteEncodingPlugin::updateMenu() +{ + if (!m_loaded) + loadSettings(); + + // uncheck everything + for (unsigned i = 0; i < m_menu->popupMenu()->count(); i++) + m_menu->popupMenu()->setItemChecked(m_menu->popupMenu()->idAt(i), false); + + QString charset = KIO::SlaveConfig::self()->configData(m_currentURL.protocol(), m_currentURL.host(), + DATA_KEY); + if (!charset.isEmpty()) + { + int id = 1; + QStringList::Iterator it; + for (it = m_encodingDescriptions.begin(); it != m_encodingDescriptions.end(); ++it, ++id) + if ((*it).find(charset) != -1) + break; + + kdDebug() << k_funcinfo << "URL=" << m_currentURL << " charset=" << charset << endl; + + if (it == m_encodingDescriptions.end()) + kdWarning() << k_funcinfo << "could not find entry for charset=" << charset << endl; + else + m_menu->popupMenu()->setItemChecked(id, true); + } + else + m_menu->popupMenu()->setItemChecked(m_idDefault, true); +} + +void +KRemoteEncodingPlugin::slotAboutToShow() +{ + if (!m_loaded) + loadSettings(); + updateMenu(); +} + +void +KRemoteEncodingPlugin::slotItemSelected(int id) +{ + KConfig config(("kio_" + m_currentURL.protocol() + "rc").latin1()); + QString host = m_currentURL.host(); + + if (!m_menu->popupMenu()->isItemChecked(id)) + { + QString charset = KGlobal::charsets()->encodingForName(m_encodingDescriptions[id - 1]); + + config.setGroup(host); + config.writeEntry(DATA_KEY, charset); + config.sync(); + + // Update the io-slaves... + updateBrowser(); + } +} + +void +KRemoteEncodingPlugin::slotDefault() +{ + // We have no choice but delete all higher domain level + // settings here since it affects what will be matched. + KConfig config(("kio_" + m_currentURL.protocol() + "rc").latin1()); + + QStringList partList = QStringList::split('.', m_currentURL.host(), false); + if (!partList.isEmpty()) + { + partList.remove(partList.begin()); + + QStringList domains; + // Remove the exact name match... + domains << m_currentURL.host(); + + while (partList.count()) + { + if (partList.count() == 2) + if (partList[0].length() <= 2 && partList[1].length() == 2) + break; + + if (partList.count() == 1) + break; + + domains << partList.join("."); + partList.remove(partList.begin()); + } + + for (QStringList::Iterator it = domains.begin(); it != domains.end(); + it++) + { + kdDebug() << k_funcinfo << "Domain to remove: " << *it << endl; + if (config.hasGroup(*it)) + config.deleteGroup(*it); + else if (config.hasKey(*it)) + config.deleteEntry(*it); + } + } + config.sync(); + + // Update the io-slaves. + updateBrowser(); +} + +void +KRemoteEncodingPlugin::updateBrowser() +{ + // Inform running io-slaves about the change... + DCOPClient *client = new DCOPClient(); + + if (!client->attach()) + kdDebug() << "Can't connect with DCOP server." << endl; + + QByteArray data; + QDataStream stream(data, IO_WriteOnly); + stream << QString::null; + // use call to make sure reparsing is done before reloading the url + QCStringList apps = client->registeredApplications(); + for( QCStringList::ConstIterator it = apps.begin(); + it != apps.end(); + ++it ) + { + QCString rtype; + QByteArray rdata; + client->call( *it, "KIO::Scheduler", "reparseSlaveConfiguration(QString)", + data, rtype, rdata); + } + delete client; + + // Reload the page with the new charset + KParts::URLArgs args = m_part->extension()->urlArgs(); + args.reload = true; + m_part->extension()->setURLArgs(args); + m_part->openURL(m_currentURL); +} + +typedef KGenericFactory < KRemoteEncodingPlugin > KRemoteEncodingPluginFactory; +K_EXPORT_COMPONENT_FACTORY(konq_remoteencoding, + KRemoteEncodingPluginFactory("kremoteencodingplugin")) +#include "kremoteencodingplugin.moc" diff --git a/konqueror/remoteencodingplugin/kremoteencodingplugin.desktop b/konqueror/remoteencodingplugin/kremoteencodingplugin.desktop new file mode 100644 index 000000000..397654bef --- /dev/null +++ b/konqueror/remoteencodingplugin/kremoteencodingplugin.desktop @@ -0,0 +1,135 @@ +[Desktop Entry] +Type=Service +X-KDE-PluginInfo-Author=Thiago Macieira +X-KDE-PluginInfo-Name=kremoteencodingplugin +X-KDE-PluginInfo-Version=3.4 +X-KDE-PluginInfo-Website= +X-KDE-PluginInfo-Category=Tools +X-KDE-PluginInfo-Depends= +X-KDE-PluginInfo-License=LGPL +X-KDE-PluginInfo-EnabledByDefault=true +X-KDE-ParentApp=konqueror +Icon=charset +Name=Remote Encoding Plugin +Name[af]=Afgeleë Enkodering Inprop Module +Name[ar]=قابس الترميز البعيد +Name[be]=Утулка аддаленага знаказбору +Name[bg]=Отдалечена кодова таблица +Name[bn]=দূরবর্তী এনকোডিং প্লাগ-ইন +Name[bs]=Dodatak za udaljeno kodiranje +Name[ca]=Endollable de codificació remota +Name[cs]=Modul vzdáleného kódování +Name[csb]=Plugins daleczégò kòdowaniô +Name[da]=Plugin for fjernkodning +Name[de]=Modul für entfernte Kodierung +Name[el]=Πρόσθετο απομακρυσμένης κωδικοποίησης +Name[eo]=Fora kodoprezento Kromaĵo +Name[es]=Complemento de codificación remota +Name[et]=Võrgukodeeringu plugin +Name[eu]=Urruneko kodeketa plugina +Name[fa]=وصلۀ کدبندی دور +Name[fi]=Etämerkinmuunnosliitännäinen +Name[fr]=Module d'encodage distant +Name[fy]=Eksterne-kodearringsplugin +Name[gl]=Plugin de Codificación Remota +Name[he]=תוסף קידוד מרוחק +Name[hr]=Dodatak za udaljeno kodiranje +Name[hu]=Távoli kódolás modul +Name[is]=Fjarlægt kóðunaríforrit +Name[it]=Plugin codifica remota +Name[ja]=リモートエンコーディングプラグイン +Name[ka]=კოდირების დაშორებული მოდული +Name[kk]=Қашықтан баптау +Name[km]=កម្មវិធីជំនួយការអ៊ិនកូដពីចម្ងាយ +Name[ko]=원격 인코딩 플러그인 +Name[lt]=Nutolusių vietų koduotės priedas +Name[mk]=Приклучок за оддалечено кодирање +Name[ms]=Plugin Pengekodan Jauh +Name[nb]=Eksterne kodingsprogramtillegg +Name[nds]=Plugin för feern Koderen +Name[ne]=टाढा सङ्केतन प्लगइन +Name[nl]=Externe-coderingsplugin +Name[nn]=Eksterne kodingsprogramtillegg +Name[pa]=ਰਿਮੋਟ ਇੰਕੋਡਿੰਗ ਪਲੱਗਇਨ +Name[pl]=Wtyczka zdalnego kodowania +Name[pt]='Plugin' de Codificação Remota +Name[pt_BR]=Plug-in de Codificação Remota +Name[ro]=Plugin de încodare la distanță +Name[ru]=Кодировка имён файлов на сервере +Name[rw]=Icomeka Gusobeka bya Kure +Name[se]=Gáiddus koden lassemoduvla +Name[sk]=Modul pre šifrovanie +Name[sl]=Vstavek Oddaljeno kodiranje +Name[sr]=Прикључак за удаљено кодирање +Name[sr@Latn]=Priključak za udaljeno kodiranje +Name[sv]=Insticksprogram för fjärrkodning +Name[ta]=தொலைதூர குறியீட்டு சொருகுப்பொருள் +Name[th]=ปลั๊กอินเข้ารหัสทางไกล +Name[tr]=Uzaktan Şifreleme Eklentisi +Name[uk]=Втулок віддаленого кодування +Name[vi]=Trình bổ sung Mã hoá Trên mạng +Name[wa]=Tchôke-divins d' ecôdaedje å lon +Name[zh_CN]=远程编码插件 +Name[zh_TW]=遠端編碼外掛程式 +Comment=Remote Encoding Plugin for Konqueror +Comment[af]=Afgeë enkodering inprop module vir Konqueror +Comment[ar]=قابس الترميز البعيد لِــ Konqueror +Comment[be]=Утулка аддаленага знаказбору для Konqueror +Comment[bg]=Приставка за отдалечена кодова таблица на браузъра +Comment[bn]=কনকরার-এর জন্য দূরবর্তী এনকোডিং প্লাগ-ইন +Comment[bs]=Dodatak za udaljeno kodiranje za Konqueror +Comment[ca]=Endollable de codificació remota per a Konqueror +Comment[cs]=Modul vzdáleného kódování pro Konqueror +Comment[csb]=Plugins daleczégò kòdowaniô dlô Konquerora +Comment[da]=Plugin for fjernkodning i Konqueror +Comment[de]=Modul zum Einstellen der Kodierung einer entfernten Gegenstelle +Comment[el]=Πρόσθετο απομακρυσμένης κωδικοποίησης για τον Konqueror +Comment[eo]=Fora kodoprezento Kromaĵo por Konkeranto +Comment[es]=Complemento de codificación remota para Konqueror +Comment[et]=Konquerori võrgukodeeringu plugin +Comment[eu]=Konquerorren urruneko kodeketa plugina +Comment[fa]=وصلۀ کدبندی دور برای Konqueror +Comment[fi]=Etämerkinmuunnosliitännäinen Konquerorille +Comment[fr]=Module d'encodage distant pour Konqueror +Comment[fy]=Eksterne-kodearringsplugin foar Konqueror +Comment[gl]=Plugin de codificación remota para Konqueror +Comment[he]=תוסף קידוד מרוחק עבור Konqueror +Comment[hr]=Dodatak za udaljeno kodiranje namijenjen Konqueroru +Comment[hu]=Távoli kódolás bővítőmodul a Konqueror böngészőhöz +Comment[is]=Fjarlægt kóðunaríforrit fyrir Konqueror +Comment[it]=Plugin per la codifica remota di Konqueror +Comment[ja]=Konqueror 用のリモートエンコーディングプラグイン +Comment[ka]=კოდირების დაშორებული მოდული Konqueror-ისთვის +Comment[kk]=Қашықтан баптау модулі +Comment[km]=កម្មវិធីជំនួយការអ៊ិនកូដសម្រាប់ Konqueror +Comment[ko]=Konqueror 원격 인코딩 플러그인 +Comment[lt]=Nutolusių vietų koduotės Konqueror priedas +Comment[mk]=Приклучок за оддалечено кодирање за Konqueror +Comment[ms]=Plugin Pengekodan Jauh untuk Konqueror +Comment[nb]=Eksterne kodingsprogramtillegg for Konqueror +Comment[nds]=Konqueror-Plugin för feern Koderen +Comment[ne]=कन्क्वेररका लागि टाढा सङ्केतन प्लगइन +Comment[nl]=Externe-coderingsplugin voor Konqueror +Comment[nn]=Eksterne kodingsprogramtillegg for Konqueror +Comment[pa]=ਕੋਨਕਿਉਰੋਰ ਲਈ ਰਿਮੋਟ ਇੰਕੋਡਿੰਗ ਪਲੱਗਇਨ +Comment[pl]=Wtyczka zdalnego kodowania dla Konquerora +Comment[pt]=Um 'Plugin' de Codificação Remota para o Konqueror +Comment[pt_BR]=Plug-in de Codificação Remota para o Konqueror +Comment[ro]=Plugin de încodare la distanță pentru Konqueror +Comment[ru]=Выбор кодировки для файлов на сервере +Comment[rw]=Icomeka Gusobeka rya Kure rijyanye na Konqueror +Comment[sk]=Modul pre šifrovanie pre Konqueror +Comment[sl]=Vstavek Oddaljeno kodiranje za Konqueror +Comment[sr]=Прикључак за удаљено кодирање за Konqueror +Comment[sr@Latn]=Priključak za udaljeno kodiranje za Konqueror +Comment[sv]=Insticksprogram för fjärrkodning i Konqueror +Comment[ta]=கான்கொரர்க்கான தொலைதூர குறியீட்டு சொருகுப்பொருள் +Comment[th]=ปลั้กอินเข้ารหัสทางไกลสำหรับคอนเควอร์เรอร์ +Comment[tr]=Konqueror için uzaktan şifreleme eklentisi +Comment[tt]=Konqueror öçen Remote Encoding Plugin +Comment[uk]=Втулок віддаленого кодування для Konqueror +Comment[vi]=Trình bổ sung Mã hoá Trên mạng cho Konqueror +Comment[wa]=Tchôke-divins d' ecôdaedje å lon po Konqueror +Comment[zh_CN]=Konqueror 的远程编码插件 +Comment[zh_TW]=Konqueror 的編碼外掛程式 diff --git a/konqueror/remoteencodingplugin/kremoteencodingplugin.h b/konqueror/remoteencodingplugin/kremoteencodingplugin.h new file mode 100644 index 000000000..85c77efa3 --- /dev/null +++ b/konqueror/remoteencodingplugin/kremoteencodingplugin.h @@ -0,0 +1,63 @@ +/* + Copyright (c) 2003 Thiago Macieira <[email protected]> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License (LGPL) as published by the Free Software Foundation; + either version 2 of the License, or (at your option) any later + version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef REMOTEENCODING_PLUGIN_H +#define REMOTEENCODING_PLUGIN_H + +#include <qstringlist.h> +#include <kurl.h> +#include <klibloader.h> +#include <kparts/plugin.h> + +class KActionMenu; +class KConfig; +class KonqDirPart; + +class KRemoteEncodingPlugin: public KParts::Plugin +{ + Q_OBJECT +public: + KRemoteEncodingPlugin(QObject * parent, const char *name, + const QStringList &); + ~KRemoteEncodingPlugin(); + +protected slots: + void slotAboutToOpenURL(); + void slotAboutToShow(); + void slotItemSelected(int); + void slotReload(); + void slotDefault(); + +private: + void updateBrowser(); + void loadSettings(); + void fillMenu(); + void updateMenu(); + + KonqDirPart *m_part; + KActionMenu *m_menu; + QStringList m_encodingDescriptions; + KURL m_currentURL; + + bool m_loaded; + int m_idDefault; +}; + +#endif diff --git a/konqueror/remoteencodingplugin/kremoteencodingplugin.rc b/konqueror/remoteencodingplugin/kremoteencodingplugin.rc new file mode 100644 index 000000000..29a283b4a --- /dev/null +++ b/konqueror/remoteencodingplugin/kremoteencodingplugin.rc @@ -0,0 +1,8 @@ +<!DOCTYPE kpartplugin> +<kpartplugin library="konq_remoteencoding"> +<MenuBar> + <Menu name="tools"><text>&Tools</text> + <Action name="changeremoteencoding"/> + </Menu> +</MenuBar> +</kpartplugin> |