summaryrefslogtreecommitdiff
path: root/src/iconmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/iconmanager.cpp')
-rw-r--r--src/iconmanager.cpp154
1 files changed, 154 insertions, 0 deletions
diff --git a/src/iconmanager.cpp b/src/iconmanager.cpp
new file mode 100644
index 00000000..694af6a5
--- /dev/null
+++ b/src/iconmanager.cpp
@@ -0,0 +1,154 @@
+/* ============================================================
+*
+* This file is a part of the rekonq project
+*
+* Copyright (C) 2010 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 "webicon.h"
+
+// KDE Includes
+#include <kmimetype.h>
+#include <KStandardDirs>
+
+// Qt Includes
+#include <QDBusInterface>
+#include <QDBusReply>
+#include <QWebElement>
+#include <QWebFrame>
+#include <QAction>
+
+
+IconManager::IconManager(QObject *parent)
+ : QObject(parent)
+{
+}
+
+
+IconManager::~IconManager()
+{
+}
+
+
+KIcon IconManager::iconForUrl(const KUrl &url)
+{
+ // first things first.. avoid infinite loop at startup
+ if (url.isEmpty() || Application::instance()->mainWindowList().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");
+
+ QString i = KMimeType::favIconForUrl(url);
+ QString faviconDir = KStandardDirs::locateLocal("cache" , "" , true);
+ if(!i.isEmpty())
+ {
+ return KIcon(faviconDir + i);
+ }
+ kDebug() << "Icon NOT Found. returning text-html one";
+
+ return KIcon("text-html");
+}
+
+
+void IconManager::provideIcon(QWebPage *page, const KUrl &url, bool notify)
+{
+ if(url.scheme() == QL1S("about"))
+ {
+ kDebug() << "URL: " << url << ". about scheme. Aborting...";
+ return;
+ }
+ QUrl u(url.url());
+ QString rootUrlString = u.toString( QUrl::RemovePassword
+ | QUrl::RemoveUserInfo
+ | QUrl::RemovePath
+ | QUrl::RemoveQuery
+ | QUrl::StripTrailingSlash);
+
+ // check if icon exists
+ if(!KMimeType::favIconForUrl(url).isEmpty())
+ {
+ kDebug() << "icon JUST present. Aborting...";
+ if(notify)
+ emit iconChanged();
+ return;
+ }
+
+ // find ico url
+ KUrl iconUrl(rootUrlString + QL1S("/favicon.ico"));
+
+ QWebElement root = page->mainFrame()->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())
+ {
+ iconUrl = relUrlString.startsWith("http")
+ ? KUrl(relUrlString)
+ : KUrl(rootUrlString + relUrlString) ;
+ }
+
+ kDebug() << "ICON URL: " << iconUrl;
+
+ QString faviconDir = KStandardDirs::locateLocal("cache" , "favicons/" , true);
+
+ int r = rootUrlString.indexOf(':');
+ kDebug() << rootUrlString;
+ kDebug() << r;
+
+ KUrl destUrl(faviconDir + rootUrlString.mid(r+3) + ".png");
+ kDebug() << "DEST URL: " << destUrl;
+
+ // download icon
+ KIO::Job *job = KIO::file_copy(iconUrl, destUrl, -1, KIO::HideProgressInfo);
+ if(notify)
+ connect(job, SIGNAL(result(KJob*)), this, SIGNAL(iconChanged()));
+}
+
+
+void IconManager::downloadIconFromUrl(const KUrl &url)
+{
+ new WebIcon(url, this);
+}