mirror of
https://bitbucket.org/smil3y/kde-extraapps.git
synced 2025-02-24 19:02:53 +00:00
243 lines
9.7 KiB
C++
243 lines
9.7 KiB
C++
/* This file is part of the KDE project
|
|
|
|
Copyright (C) 2002 Patrick Charbonnier <pch@valleeurpe.net>
|
|
Copyright (C) 2002 Carsten Pfeiffer <pfeiffer@kde.org>
|
|
Copyright (C) 2007 Urs Wolfer <uwolfer @ kde.org>
|
|
Copyright (C) 2010 Dawit Alemayehu <adawit@kde.org>
|
|
Copyright (C) 2010 Matthias Fuchs <mat69@gmx.net>
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2 of the License, or (at your option) any later version.
|
|
*/
|
|
|
|
#include "kget_plug_in.h"
|
|
|
|
#include "kget_interface.h"
|
|
|
|
#include <KActionCollection>
|
|
#include <KToggleAction>
|
|
#include <KActionMenu>
|
|
#include <KIconLoader>
|
|
#include <KComponentData>
|
|
#include <KLocale>
|
|
#include <KMessageBox>
|
|
#include <KMenu>
|
|
#include <KRun>
|
|
#include <KIcon>
|
|
#include <KToolInvocation>
|
|
#include <KPluginFactory>
|
|
#include <KProtocolInfo>
|
|
#include <KFileItem>
|
|
#include <KParts/Part>
|
|
#include <KParts/PartManager>
|
|
#include <KParts/HtmlExtension>
|
|
#include <KParts/FileInfoExtension>
|
|
|
|
#include <QtDBus/QDBusConnection>
|
|
|
|
|
|
#define QL1S(x) QLatin1String(x)
|
|
|
|
K_PLUGIN_FACTORY(KGetPluginFactory, registerPlugin<KGetPlugin>();)
|
|
K_EXPORT_PLUGIN(KGetPluginFactory("kgetplugin"))
|
|
|
|
static QWidget* partWidget(QObject* obj)
|
|
{
|
|
KParts::ReadOnlyPart* part = qobject_cast<KParts::ReadOnlyPart*>(obj);
|
|
return part ? part->widget() : 0;
|
|
}
|
|
|
|
KGetPlugin::KGetPlugin(QObject *parent, const QVariantList&)
|
|
:KParts::Plugin(parent)
|
|
{
|
|
KActionMenu *menu = new KActionMenu(KIcon("kget"), i18n("Download Manager"), actionCollection());
|
|
actionCollection()->addAction("kget_menu", menu);
|
|
|
|
menu->setDelayed( false );
|
|
connect( menu->menu(), SIGNAL(aboutToShow()), SLOT(showPopup()));
|
|
|
|
m_dropTargetAction = new KToggleAction(i18n("Show Drop Target"), actionCollection());
|
|
|
|
connect(m_dropTargetAction, SIGNAL(triggered()), this, SLOT(slotShowDrop()));
|
|
actionCollection()->addAction(QL1S("show_drop"), m_dropTargetAction);
|
|
menu->addAction(m_dropTargetAction);
|
|
|
|
QAction *showLinksAction = actionCollection()->addAction(QL1S("show_links"));
|
|
showLinksAction->setText(i18n("List All Links"));
|
|
connect(showLinksAction, SIGNAL(triggered()), SLOT(slotShowLinks()));
|
|
menu->addAction(showLinksAction);
|
|
|
|
QAction *showSelectedLinksAction = actionCollection()->addAction(QL1S("show_selected_links"));
|
|
showSelectedLinksAction->setText(i18n("List Selected Links"));
|
|
connect(showSelectedLinksAction, SIGNAL(triggered()), SLOT(slotShowSelectedLinks()));
|
|
menu->addAction(showSelectedLinksAction);
|
|
|
|
// Hide this plugin if the parent part does not support either
|
|
// The FileInfo or Html extensions...
|
|
if (!KParts::HtmlExtension::childObject(parent) && !KParts::FileInfoExtension::childObject(parent))
|
|
menu->setVisible(false);
|
|
}
|
|
|
|
|
|
KGetPlugin::~KGetPlugin()
|
|
{
|
|
}
|
|
|
|
static bool hasDropTarget()
|
|
{
|
|
bool found = false;
|
|
|
|
if (QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.kget")) {
|
|
OrgKdeKgetMainInterface kgetInterface("org.kde.kget", "/KGet", QDBusConnection::sessionBus());
|
|
QDBusReply<bool> reply = kgetInterface.dropTargetVisible();
|
|
if (reply.isValid()) {
|
|
found = reply.value();
|
|
}
|
|
}
|
|
|
|
return found;
|
|
}
|
|
|
|
void KGetPlugin::showPopup()
|
|
{
|
|
// Check for HtmlExtension support...
|
|
KParts::HtmlExtension* htmlExtn = KParts::HtmlExtension::childObject(parent());
|
|
if (htmlExtn) {
|
|
KParts::SelectorInterface* selector = qobject_cast<KParts::SelectorInterface*>(htmlExtn);
|
|
if (selector) {
|
|
m_dropTargetAction->setChecked(hasDropTarget());
|
|
const KParts::SelectorInterface::QueryMethods methods = selector->supportedQueryMethods();
|
|
bool enable = (methods & KParts::SelectorInterface::EntireContent);
|
|
actionCollection()->action(QL1S("show_links"))->setEnabled(enable);
|
|
enable = (htmlExtn->hasSelection() && (methods & KParts::SelectorInterface::SelectedContent));
|
|
actionCollection()->action(QL1S("show_selected_links"))->setEnabled(enable);
|
|
enable = (actionCollection()->action(QL1S("show_links"))->isEnabled() ||
|
|
actionCollection()->action(QL1S("show_selected_links"))->isEnabled());
|
|
actionCollection()->action(QL1S("show_drop"))->setEnabled(enable);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Check for FileInfoExtension support...
|
|
KParts::FileInfoExtension* fileinfoExtn = KParts::FileInfoExtension::childObject(parent());
|
|
if (fileinfoExtn) {
|
|
m_dropTargetAction->setChecked(hasDropTarget());
|
|
const KParts::FileInfoExtension::QueryModes modes = fileinfoExtn->supportedQueryModes();
|
|
bool enable = (modes & KParts::FileInfoExtension::AllItems);
|
|
actionCollection()->action(QL1S("show_links"))->setEnabled(enable);
|
|
enable = (fileinfoExtn->hasSelection() && (modes & KParts::FileInfoExtension::SelectedItems));
|
|
actionCollection()->action(QL1S("show_selected_links"))->setEnabled(enable);
|
|
enable = (actionCollection()->action(QL1S("show_links"))->isEnabled() ||
|
|
actionCollection()->action(QL1S("show_selected_links"))->isEnabled());
|
|
actionCollection()->action(QL1S("show_drop"))->setEnabled(enable);
|
|
return;
|
|
}
|
|
|
|
actionCollection()->action(QL1S("show_selected_links"))->setEnabled(false);
|
|
actionCollection()->action(QL1S("show_links"))->setEnabled(false);
|
|
actionCollection()->action(QL1S("show_drop"))->setEnabled(false);
|
|
if (m_dropTargetAction->isChecked())
|
|
m_dropTargetAction->setChecked(false);
|
|
}
|
|
|
|
void KGetPlugin::slotShowDrop()
|
|
{
|
|
if (!QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.kget")) {
|
|
KRun::runCommand("kget --showDropTarget --hideMainWindow", "kget", "kget", partWidget(parent()));
|
|
} else {
|
|
OrgKdeKgetMainInterface kgetInterface("org.kde.kget", "/KGet", QDBusConnection::sessionBus());
|
|
kgetInterface.setDropTargetVisible(m_dropTargetAction->isChecked());
|
|
}
|
|
}
|
|
|
|
void KGetPlugin::slotShowLinks()
|
|
{
|
|
getLinks(false);
|
|
}
|
|
|
|
void KGetPlugin::slotShowSelectedLinks()
|
|
{
|
|
getLinks(true);
|
|
}
|
|
|
|
void KGetPlugin::slotImportLinks()
|
|
{
|
|
if (m_linkList.isEmpty()) {
|
|
KMessageBox::sorry(partWidget(parent()),
|
|
i18n("No downloadable links were found."),
|
|
i18n("No Links"));
|
|
return;
|
|
}
|
|
|
|
// Remove any duplicates links from the list...
|
|
m_linkList.removeDuplicates();
|
|
|
|
if (!QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.kget") &&
|
|
KToolInvocation::kdeinitExecWait("kget") != 0) {
|
|
KMessageBox::sorry(partWidget(parent()),
|
|
i18n("Unable to communicate with the KGet download manager."),
|
|
i18n("Communication Error"));
|
|
return;
|
|
}
|
|
|
|
OrgKdeKgetMainInterface kgetInterface("org.kde.kget", "/KGet", QDBusConnection::sessionBus());
|
|
kgetInterface.importLinks(m_linkList);
|
|
}
|
|
|
|
void KGetPlugin::getLinks(bool selectedOnly)
|
|
{
|
|
KParts::HtmlExtension* htmlExtn = KParts::HtmlExtension::childObject(parent());
|
|
if (htmlExtn) {
|
|
KParts::SelectorInterface* selector = qobject_cast<KParts::SelectorInterface*>(htmlExtn);
|
|
if (selector) {
|
|
m_linkList.clear();
|
|
const QUrl baseUrl = htmlExtn->baseUrl();
|
|
const QString query = QL1S("a[href], img[src], audio[src], video[src], embed[src], object[data]");
|
|
const KParts::SelectorInterface::QueryMethod method = (selectedOnly ? KParts::SelectorInterface::SelectedContent:
|
|
KParts::SelectorInterface::EntireContent);
|
|
const QList<KParts::SelectorInterface::Element> elements = selector->querySelectorAll(query, method);
|
|
QString attr;
|
|
Q_FOREACH(const KParts::SelectorInterface::Element& element, elements) {
|
|
if (element.hasAttribute(QL1S("href")))
|
|
attr = QL1S("href");
|
|
else if (element.hasAttribute(QL1S("src")))
|
|
attr = QL1S("src");
|
|
else if (element.hasAttribute(QL1S("data")))
|
|
attr = QL1S("data");
|
|
const KUrl resolvedUrl (baseUrl.resolved(element.attribute(attr)));
|
|
// Only select valid and non-local links for download...
|
|
if (resolvedUrl.isValid() && !resolvedUrl.isLocalFile() && !resolvedUrl.host().isEmpty()) {
|
|
if (element.hasAttribute(QL1S("type")))
|
|
m_linkList << QString(QL1S("url ") + resolvedUrl.url() + QL1S(" type ") + element.attribute(QL1S("type")));
|
|
else
|
|
m_linkList << resolvedUrl.url();
|
|
|
|
}
|
|
}
|
|
}
|
|
slotImportLinks();
|
|
}
|
|
|
|
KParts::FileInfoExtension* fileinfoExtn = KParts::FileInfoExtension::childObject(parent());
|
|
if (fileinfoExtn) {
|
|
m_linkList.clear();
|
|
const KParts::FileInfoExtension::QueryMode mode = (selectedOnly ? KParts::FileInfoExtension::SelectedItems:
|
|
KParts::FileInfoExtension::AllItems);
|
|
const KFileItemList items = fileinfoExtn->queryFor(mode);
|
|
Q_FOREACH(const KFileItem& item, items) {
|
|
const KUrl url = item.url();
|
|
// Only select valid and non local links for download...
|
|
if (item.isReadable() && item.isFile() && !item.isLocalFile() && !url.host().isEmpty()) {
|
|
if (item.mimetype().isEmpty())
|
|
m_linkList << url.url();
|
|
else
|
|
m_linkList << QString(QL1S("url ") + url.url() + QL1S(" type ") + item.mimetype());
|
|
}
|
|
}
|
|
slotImportLinks();
|
|
}
|
|
}
|
|
|
|
#include "moc_kget_plug_in.cpp"
|