summaryrefslogtreecommitdiff
path: root/src/icons
diff options
context:
space:
mode:
authorAndrea Diamantini <adjam7@gmail.com>2012-07-31 18:28:11 +0200
committerAndrea Diamantini <adjam7@gmail.com>2012-12-10 02:48:04 +0100
commite849d3a657ca33b168c445152d1b9d11966de844 (patch)
treeb5ae91cf212a056a36f89dab842df656bcc8465b /src/icons
parentBookmark Manager restore (diff)
downloadrekonq-e849d3a657ca33b168c445152d1b9d11966de844.tar.xz
IconManager restore
Just 3 lines fixes ;) Also clean up in the dir structure...
Diffstat (limited to 'src/icons')
-rw-r--r--src/icons/icondownloader.cpp112
-rw-r--r--src/icons/icondownloader.h61
-rw-r--r--src/icons/iconmanager.cpp280
-rw-r--r--src/icons/iconmanager.h82
-rw-r--r--src/icons/webicon.cpp66
-rw-r--r--src/icons/webicon.h56
6 files changed, 657 insertions, 0 deletions
diff --git a/src/icons/icondownloader.cpp b/src/icons/icondownloader.cpp
new file mode 100644
index 00000000..6d1f3a5e
--- /dev/null
+++ b/src/icons/icondownloader.cpp
@@ -0,0 +1,112 @@
+/* ============================================================
+*
+* This file is a part of the rekonq project
+*
+* Copyright (C) 2012 by Andrea Diamantini <adjam7 at gmail dot com>
+*
+*
+* 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) version 3 or any later version
+* accepted by the membership of KDE e.V. (or its successor approved
+* by the membership of KDE e.V.), which shall act as a proxy
+* defined in Section 14 of version 3 of the license.
+*
+* This program 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 General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+* ============================================================ */
+
+
+// Self Includes
+#include "icondownloader.h"
+#include "icondownloader.moc"
+
+// Qt Includes
+#include <QNetworkAccessManager>
+#include <QNetworkReply>
+#include <QNetworkRequest>
+#include <QFile>
+#include <QPixmap>
+
+
+IconDownloader::IconDownloader(const KUrl &srcUrl, const KUrl &destUrl, QObject *parent)
+ : QObject(parent)
+ , m_srcUrl(srcUrl)
+ , m_destUrl(destUrl)
+{
+ QNetworkAccessManager *manager = new QNetworkAccessManager(this);
+ connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
+ manager->get(QNetworkRequest(srcUrl));
+}
+
+
+void IconDownloader::replyFinished(QNetworkReply *reply)
+{
+ if (reply->error())
+ {
+ kDebug() << "FAVICON JOB ERROR";
+ emit iconReady();
+ this->deleteLater();
+ return;
+ }
+
+ QString s = m_destUrl.url().remove(QL1S("file://"));
+ QFile favicon(s);
+ if (!favicon.open(QIODevice::WriteOnly))
+ {
+ kDebug() << "FAVICON FILE NOT OPENED";
+ emit iconReady();
+ this->deleteLater();
+ return;
+ }
+
+ favicon.write(reply->readAll());
+ favicon.close();
+
+ if (favicon.size() == 0)
+ {
+ kDebug() << "SIZE ZERO FAVICON";
+ favicon.remove();
+ emit iconReady();
+ this->deleteLater();
+ return;
+ }
+
+ QPixmap px;
+ if (!px.load(s))
+ {
+ kDebug() << "PIXMAP NOT LOADED";
+ emit iconReady();
+ this->deleteLater();
+ return;
+ }
+
+ if (px.isNull())
+ {
+ kDebug() << "PIXMAP IS NULL";
+ favicon.remove();
+ emit iconReady();
+ this->deleteLater();
+ return;
+ }
+
+ px = px.scaled(16, 16);
+ if (!px.save(s + QL1S(".png"), "PNG"))
+ {
+ kDebug() << "PIXMAP NOT SAVED";
+ emit iconReady();
+ this->deleteLater();
+ return;
+ }
+
+ QFile::remove(s);
+ emit iconReady();
+ this->deleteLater();
+}
diff --git a/src/icons/icondownloader.h b/src/icons/icondownloader.h
new file mode 100644
index 00000000..54fd60fb
--- /dev/null
+++ b/src/icons/icondownloader.h
@@ -0,0 +1,61 @@
+/* ============================================================
+*
+* This file is a part of the rekonq project
+*
+* Copyright (C) 2012 by Andrea Diamantini <adjam7 at gmail dot com>
+*
+*
+* 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) version 3 or any later version
+* accepted by the membership of KDE e.V. (or its successor approved
+* by the membership of KDE e.V.), which shall act as a proxy
+* defined in Section 14 of version 3 of the license.
+*
+* This program 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 General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+* ============================================================ */
+
+
+#ifndef ICON_DOWNLOADER_H
+#define ICON_DOWNLOADER_H
+
+// rekonq Includes
+#include "rekonq_defines.h"
+
+// Qt Includes
+#include <QObject>
+
+// KDE Includes
+#include <KUrl>
+
+// Forward Declarations
+class QNetworkReply;
+
+
+class IconDownloader : public QObject
+{
+ Q_OBJECT
+
+public:
+ IconDownloader(const KUrl &srcUrl, const KUrl &destUrl, QObject *parent = 0);
+
+private Q_SLOTS:
+ void replyFinished(QNetworkReply *);
+
+Q_SIGNALS:
+ void iconReady();
+
+private:
+ KUrl m_srcUrl;
+ KUrl m_destUrl;
+};
+
+#endif // ICON_DOWNLOADER_H
diff --git a/src/icons/iconmanager.cpp b/src/icons/iconmanager.cpp
new file mode 100644
index 00000000..7799eb99
--- /dev/null
+++ b/src/icons/iconmanager.cpp
@@ -0,0 +1,280 @@
+/* ============================================================
+*
+* This file is a part of the rekonq project
+*
+* Copyright (C) 2010-2012 by Andrea Diamantini <adjam7 at gmail dot com>
+*
+*
+* 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) version 3 or any later version
+* accepted by the membership of KDE e.V. (or its successor approved
+* by the membership of KDE e.V.), which shall act as a proxy
+* defined in Section 14 of version 3 of the license.
+*
+* This program 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 General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+* ============================================================ */
+
+
+// Self Includes
+#include "iconmanager.h"
+#include "iconmanager.moc"
+
+// Local Includes
+#include "application.h"
+#include "icondownloader.h"
+#include "webicon.h"
+
+// KDE Includes
+#include <KIO/Job>
+
+#include <KIcon>
+#include <KStandardDirs>
+#include <KUrl>
+
+// Qt Includes
+#include <QDir>
+
+#include <QWebElement>
+#include <QWebFrame>
+#include <QWebSettings>
+
+
+QWeakPointer<IconManager> IconManager::s_iconManager;
+
+
+IconManager *IconManager::self()
+{
+ if (s_iconManager.isNull())
+ {
+ s_iconManager = new IconManager(qApp);
+ }
+ return s_iconManager.data();
+}
+
+
+// ----------------------------------------------------------------------------------------------
+
+
+IconManager::IconManager(QObject *parent)
+ : QObject(parent)
+{
+ _faviconsDir = KStandardDirs::locateLocal("cache" , "favicons/" , true);
+}
+
+
+KIcon IconManager::iconForUrl(const KUrl &url)
+{
+ // first things first.. avoid infinite loop at startup
+ if (url.isEmpty() || rApp->tabWindowList().isEmpty())
+ return KIcon("text-html");
+
+ QByteArray encodedUrl = url.toEncoded();
+ // rekonq icons..
+ if (encodedUrl == QByteArray("about:home"))
+ return KIcon("go-home");
+ if (encodedUrl == QByteArray("about:closedTabs"))
+ return KIcon("tab-close");
+ if (encodedUrl == QByteArray("about:history"))
+ return KIcon("view-history");
+ if (encodedUrl == QByteArray("about:bookmarks"))
+ return KIcon("bookmarks");
+ if (encodedUrl == QByteArray("about:favorites"))
+ return KIcon("emblem-favorite");
+ if (encodedUrl == QByteArray("about:downloads"))
+ return KIcon("download");
+ if (encodedUrl == QByteArray("about:tabs"))
+ return KIcon("tab-duplicate");
+
+ // TODO: return other mimetype icons
+ if (url.isLocalFile())
+ {
+ return KIcon("folder");
+ }
+
+ QString i = favIconForUrl(url);
+ if (!i.isEmpty())
+ {
+ return KIcon(QIcon(_faviconsDir + i));
+ }
+
+ // Not found icon. Return default one.
+ return KIcon("text-html");
+}
+
+
+void IconManager::provideIcon(QWebFrame *mFrame, const KUrl &url, bool notify)
+{
+ // provide icons just for http/https sites
+ if (!url.scheme().startsWith(QL1S("http")))
+ {
+ if (notify)
+ emit iconChanged();
+ return;
+ }
+
+ // do not load new icons in private browsing..
+ if (QWebSettings::globalSettings()->testAttribute(QWebSettings::PrivateBrowsingEnabled))
+ {
+ if (notify)
+ emit iconChanged();
+ return;
+ }
+
+ // check if icon exists
+ if (!favIconForUrl(url).isEmpty())
+ {
+ if (notify)
+ emit iconChanged();
+ return;
+ }
+
+ // the simplest way..
+ const QString rootUrlString = url.scheme() + QL1S("://") + url.host();
+
+ // find favicon url
+ KUrl faviconUrl(rootUrlString + QL1S("/favicon.ico"));
+
+
+ QWebElement root = mFrame->documentElement();
+ QWebElement e = root.findFirst(QL1S("link[rel~=\"icon\"]"));
+ QString relUrlString = e.attribute(QL1S("href"));
+ if (relUrlString.isEmpty())
+ {
+ e = root.findFirst(QL1S("link[rel~=\"shortcut icon\"]"));
+ relUrlString = e.attribute(QL1S("href"));
+ }
+
+ if (!relUrlString.isEmpty())
+ {
+ faviconUrl = relUrlString.startsWith(QL1S("http"))
+ ? KUrl(relUrlString)
+ : KUrl(rootUrlString + QL1C('/') + relUrlString);
+ }
+
+ // dest url
+ KUrl destUrl(_faviconsDir + url.host());
+
+ IconDownloader *id = new IconDownloader(faviconUrl, destUrl, this);
+ if (notify)
+ connect(id, SIGNAL(iconReady()), this, SIGNAL(iconChanged()));
+}
+
+
+void IconManager::downloadIconFromUrl(const KUrl &url)
+{
+ new WebIcon(url, this);
+}
+
+
+void IconManager::clearIconCache()
+{
+ QDir d(_faviconsDir);
+ QStringList favicons = d.entryList();
+ Q_FOREACH(const QString & fav, favicons)
+ {
+ d.remove(fav);
+ }
+}
+
+
+void IconManager::saveDesktopIconForUrl(const KUrl &u)
+{
+ KIcon icon = iconForUrl(u);
+ QString destPath = _faviconsDir + u.host() + QL1S("_WEBAPPICON.png");
+
+ QPixmap pix = icon.pixmap(16, 16);
+ int s = KIconLoader::global()->currentSize(KIconLoader::Desktop);
+ pix = pix.scaled(s, s);
+
+ pix.save(destPath);
+}
+
+
+// NOTE: this function is builded "around" the iconForurl one. It basically returns the same things
+// with an important difference: this one returns paths while the other one returns KIcons
+QString IconManager::iconPathForUrl(const KUrl &url)
+{
+ // first things first.. avoid infinite loop at startup
+ if (url.isEmpty() || rApp->tabWindowList().isEmpty())
+ {
+ QString icon = QL1S("file://") + KGlobal::dirs()->findResource("icon", "oxygen/16x16/mimetypes/text-html.png");
+ return icon;
+ }
+
+ QByteArray encodedUrl = url.toEncoded();
+ // rekonq icons..
+ if (encodedUrl == QByteArray("about:home"))
+ {
+ QString icon = QL1S("file://") + KGlobal::dirs()->findResource("icon", "oxygen/16x16/actions/go-home.png");
+ return icon;
+ }
+ if (encodedUrl == QByteArray("about:closedTabs"))
+ {
+ QString icon = QL1S("file://") + KGlobal::dirs()->findResource("icon", "oxygen/16x16/actions/tab-close.png");
+ return icon;
+ }
+ if (encodedUrl == QByteArray("about:history"))
+ {
+ QString icon = QL1S("file://") + KGlobal::dirs()->findResource("icon", "oxygen/16x16/actions/view-history.png");
+ return icon;
+ }
+ if (encodedUrl == QByteArray("about:bookmarks"))
+ {
+ QString icon = QL1S("file://") + KGlobal::dirs()->findResource("icon", "oxygen/16x16/places/bookmarks.png");
+ return icon;
+ }
+ if (encodedUrl == QByteArray("about:favorites"))
+ {
+ QString icon = QL1S("file://") + KGlobal::dirs()->findResource("icon", "oxygen/16x16/emblems/emblem-favorite.png");
+ return icon;
+ }
+ if (encodedUrl == QByteArray("about:downloads"))
+ {
+ QString icon = QL1S("file://") + KGlobal::dirs()->findResource("icon", "oxygen/16x16/actions/download.png");
+ return icon;
+ }
+ if (encodedUrl == QByteArray("about:tabs"))
+ {
+ QString icon = QL1S("file://") + KGlobal::dirs()->findResource("icon", "oxygen/16x16/actions/tab-duplicate.png");
+ return icon;
+ }
+
+ // TODO: return other mimetype icons
+ if (url.isLocalFile())
+ {
+ QString icon = QL1S("file://") + KGlobal::dirs()->findResource("icon", "oxygen/16x16/places/folder.png");
+ return icon;
+ }
+
+ QString i = favIconForUrl(url);
+ if (!i.isEmpty())
+ {
+ return QL1S("file://") + _faviconsDir + i;
+ }
+
+ // Not found icon. Return default one.
+ QString icon = QL1S("file://") + KGlobal::dirs()->findResource("icon", "oxygen/16x16/mimetypes/text-html.png");
+ return icon;
+}
+
+
+QString IconManager::favIconForUrl(const KUrl &url)
+{
+ if (url.isLocalFile()
+ || !url.protocol().startsWith(QL1S("http")))
+ return QString();
+
+ if (QFile::exists(_faviconsDir + url.host() + QL1S(".png")))
+ return url.host() + QL1S(".png");
+ else
+ return QString();
+}
diff --git a/src/icons/iconmanager.h b/src/icons/iconmanager.h
new file mode 100644
index 00000000..02ae6763
--- /dev/null
+++ b/src/icons/iconmanager.h
@@ -0,0 +1,82 @@
+/* ============================================================
+*
+* This file is a part of the rekonq project
+*
+* Copyright (C) 2010-2012 by Andrea Diamantini <adjam7 at gmail dot com>
+*
+*
+* 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) version 3 or any later version
+* accepted by the membership of KDE e.V. (or its successor approved
+* by the membership of KDE e.V.), which shall act as a proxy
+* defined in Section 14 of version 3 of the license.
+*
+* This program 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 General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+* ============================================================ */
+
+
+#ifndef ICON_MANAGER_H
+#define ICON_MANAGER_H
+
+// Rekonq Includes
+#include "rekonq_defines.h"
+
+// Qt Includes
+#include <QObject>
+#include <QWeakPointer>
+#include <QString>
+
+// Forward Declarations
+class KIcon;
+class QWebFrame;
+class KJob;
+
+
+class REKONQ_TESTS_EXPORT IconManager : public QObject
+{
+ Q_OBJECT
+
+public:
+ /**
+ * Entry point.
+ * Access to IconManager class by using
+ * IconManager::self()->thePublicMethodYouNeed()
+ */
+ static IconManager *self();
+
+ KIcon iconForUrl(const KUrl &url);
+ QString iconPathForUrl(const KUrl &url);
+
+ void provideIcon(QWebFrame *mFrame, const KUrl &url, bool notify = true);
+
+ void downloadIconFromUrl(const KUrl &url);
+
+ void clearIconCache();
+
+ void saveDesktopIconForUrl(const KUrl &u);
+
+Q_SIGNALS:
+ void iconChanged();
+
+private:
+ IconManager(QObject *parent = 0);
+
+ bool existsIconForUrl(const KUrl &url);
+ QString favIconForUrl(const KUrl &url);
+
+ QString _faviconsDir;
+
+ static QWeakPointer<IconManager> s_iconManager;
+};
+
+
+#endif // ICON_MANAGER_H
diff --git a/src/icons/webicon.cpp b/src/icons/webicon.cpp
new file mode 100644
index 00000000..ce482637
--- /dev/null
+++ b/src/icons/webicon.cpp
@@ -0,0 +1,66 @@
+/* ============================================================
+*
+* This file is a part of the rekonq project
+*
+* Copyright (C) 2010-2011 by Andrea Diamantini <adjam7 at gmail dot com>
+*
+*
+* 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) version 3 or any later version
+* accepted by the membership of KDE e.V. (or its successor approved
+* by the membership of KDE e.V.), which shall act as a proxy
+* defined in Section 14 of version 3 of the license.
+*
+* This program 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 General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+* ============================================================ */
+
+
+// Self Includes
+#include "webicon.h"
+#include "webicon.moc"
+
+// Local Includes
+#include "iconmanager.h"
+
+// Qt Includes
+#include <QTimer>
+#include <QWebFrame>
+
+
+WebIcon::WebIcon(const KUrl& url, QObject *parent)
+ : QObject(parent)
+ , m_url(url)
+{
+ m_page.settings()->setAttribute(QWebSettings::PluginsEnabled, false);
+ m_page.settings()->setAttribute(QWebSettings::JavascriptEnabled, false);
+ m_page.settings()->setAttribute(QWebSettings::PrivateBrowsingEnabled, true);
+
+ connect(&m_page, SIGNAL(loadFinished(bool)), this, SLOT(saveIcon(bool)));
+ QTimer::singleShot(0, this, SLOT(load()));
+}
+
+
+void WebIcon::load()
+{
+ m_page.mainFrame()->load(m_url);
+}
+
+
+void WebIcon::saveIcon(bool b)
+{
+ if (b)
+ {
+ IconManager::self()->provideIcon(m_page.mainFrame(), m_url, false);
+ }
+
+ this->deleteLater();
+}
diff --git a/src/icons/webicon.h b/src/icons/webicon.h
new file mode 100644
index 00000000..39f98e7e
--- /dev/null
+++ b/src/icons/webicon.h
@@ -0,0 +1,56 @@
+/* ============================================================
+*
+* This file is a part of the rekonq project
+*
+* Copyright (C) 2010-2011 by Andrea Diamantini <adjam7 at gmail dot com>
+*
+*
+* 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) version 3 or any later version
+* accepted by the membership of KDE e.V. (or its successor approved
+* by the membership of KDE e.V.), which shall act as a proxy
+* defined in Section 14 of version 3 of the license.
+*
+* This program 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 General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+* ============================================================ */
+
+
+#ifndef WEB_ICON_H
+#define WEB_ICON_H
+
+// Rekonq Includes
+#include "rekonq_defines.h"
+
+// KDE Includes
+#include <KUrl>
+
+// Qt Includes
+#include <QWebPage>
+
+
+class REKONQ_TESTS_EXPORT WebIcon : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit WebIcon(const KUrl &url, QObject *parent = 0);
+
+private Q_SLOTS:
+ void load();
+ void saveIcon(bool);
+
+private:
+ QWebPage m_page;
+ KUrl m_url;
+};
+
+#endif //WEB_ICON_H