From e849d3a657ca33b168c445152d1b9d11966de844 Mon Sep 17 00:00:00 2001 From: Andrea Diamantini Date: Tue, 31 Jul 2012 18:28:11 +0200 Subject: IconManager restore Just 3 lines fixes ;) Also clean up in the dir structure... --- src/CMakeLists.txt | 10 +- src/icons/icondownloader.cpp | 112 ++++++++++++++ src/icons/icondownloader.h | 61 ++++++++ src/icons/iconmanager.cpp | 280 ++++++++++++++++++++++++++++++++++ src/icons/iconmanager.h | 82 ++++++++++ src/icons/webicon.cpp | 66 ++++++++ src/icons/webicon.h | 56 +++++++ src/session/sessionmanager.cpp | 331 ----------------------------------------- src/session/sessionmanager.h | 104 ------------- src/sessionmanager.cpp | 331 +++++++++++++++++++++++++++++++++++++++++ src/sessionmanager.h | 104 +++++++++++++ 11 files changed, 1100 insertions(+), 437 deletions(-) create mode 100644 src/icons/icondownloader.cpp create mode 100644 src/icons/icondownloader.h create mode 100644 src/icons/iconmanager.cpp create mode 100644 src/icons/iconmanager.h create mode 100644 src/icons/webicon.cpp create mode 100644 src/icons/webicon.h delete mode 100644 src/session/sessionmanager.cpp delete mode 100644 src/session/sessionmanager.h create mode 100644 src/sessionmanager.cpp create mode 100644 src/sessionmanager.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0ca0f1dd..d858f41a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -12,6 +12,7 @@ set(rekonq_KDEINIT_SRCS application.cpp autosaver.cpp searchengine.cpp + sessionmanager.cpp urlresolver.cpp websnap.cpp #---------------------------------------- @@ -32,7 +33,9 @@ set(rekonq_KDEINIT_SRCS history/historymanager.cpp history/historymodels.cpp #---------------------------------------- - session/sessionmanager.cpp + icons/icondownloader.cpp + icons/iconmanager.cpp + icons/webicon.cpp #---------------------------------------- settings/settingsdialog.cpp settings/appearancewidget.cpp @@ -67,6 +70,9 @@ ENDIF(HAVE_NEPOMUK) # ui files KDE4_ADD_UI_FILES( rekonq_KDEINIT_SRCS + # ---------------------------------------- + adblock/blocked_elements.ui + adblock/settings_adblock.ui #---------------------------------------- settings/settings_general.ui settings/settings_tabs.ui @@ -84,7 +90,7 @@ INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/adblock ${CMAKE_CURRENT_SOURCE_DIR}/bookmarks ${CMAKE_CURRENT_SOURCE_DIR}/history - ${CMAKE_CURRENT_SOURCE_DIR}/session + ${CMAKE_CURRENT_SOURCE_DIR}/icons ${CMAKE_CURRENT_SOURCE_DIR}/settings ${CMAKE_CURRENT_SOURCE_DIR}/urlbar ${CMAKE_CURRENT_SOURCE_DIR}/tabwindow 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 +* +* +* 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 . +* +* ============================================================ */ + + +// Self Includes +#include "icondownloader.h" +#include "icondownloader.moc" + +// Qt Includes +#include +#include +#include +#include +#include + + +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 +* +* +* 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 . +* +* ============================================================ */ + + +#ifndef ICON_DOWNLOADER_H +#define ICON_DOWNLOADER_H + +// rekonq Includes +#include "rekonq_defines.h" + +// Qt Includes +#include + +// KDE Includes +#include + +// 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 +* +* +* 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 . +* +* ============================================================ */ + + +// Self Includes +#include "iconmanager.h" +#include "iconmanager.moc" + +// Local Includes +#include "application.h" +#include "icondownloader.h" +#include "webicon.h" + +// KDE Includes +#include + +#include +#include +#include + +// Qt Includes +#include + +#include +#include +#include + + +QWeakPointer 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 +* +* +* 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 . +* +* ============================================================ */ + + +#ifndef ICON_MANAGER_H +#define ICON_MANAGER_H + +// Rekonq Includes +#include "rekonq_defines.h" + +// Qt Includes +#include +#include +#include + +// 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 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 +* +* +* 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 . +* +* ============================================================ */ + + +// Self Includes +#include "webicon.h" +#include "webicon.moc" + +// Local Includes +#include "iconmanager.h" + +// Qt Includes +#include +#include + + +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 +* +* +* 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 . +* +* ============================================================ */ + + +#ifndef WEB_ICON_H +#define WEB_ICON_H + +// Rekonq Includes +#include "rekonq_defines.h" + +// KDE Includes +#include + +// Qt Includes +#include + + +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 diff --git a/src/session/sessionmanager.cpp b/src/session/sessionmanager.cpp deleted file mode 100644 index 771aca55..00000000 --- a/src/session/sessionmanager.cpp +++ /dev/null @@ -1,331 +0,0 @@ -/* ============================================================ -* -* This file is a part of the rekonq project -* -* Copyright (C) 2009-2012 by Andrea Diamantini -* Copyright (C) 2009 by Yoram Bar-Haim < -* Copyright (C) 2009-2011 by Lionel Chauvin -* -* -* 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 . -* -* ============================================================ */ - - -// Self Includes -#include "sessionmanager.h" -#include "sessionmanager.moc" - -// Local Includes -#include "application.h" -#include "autosaver.h" -#include "tabhistory.h" -#include "tabwindow.h" -#include "webwindow.h" -#include "webpage.h" - -// KDE Includes -#include -#include - -// Qt Includes -#include -#include - - -// Only used internally -bool readSessionDocument(QDomDocument & document, const QString & sessionFilePath) -{ - QFile sessionFile(sessionFilePath); - - if (!sessionFile.exists()) - return false; - - if (!sessionFile.open(QFile::ReadOnly)) - { - kDebug() << "Unable to open session file" << sessionFile.fileName(); - return false; - } - - if (!document.setContent(&sessionFile, false)) - { - kDebug() << "Unable to parse session file" << sessionFile.fileName(); - return false; - } - - return true; -} - - -int loadTabs(TabWindow *tw, QDomElement & window, bool useFirstTab) -{ - int currentTab = 0; - - for (unsigned int tabNo = 0; tabNo < window.elementsByTagName("tab").length(); tabNo++) - { - QDomElement tab = window.elementsByTagName("tab").at(tabNo).toElement(); - if (tab.hasAttribute("currentTab")) - currentTab = tabNo; - - KUrl u = KUrl(tab.attribute("url")); - - TabHistory tabHistory; - tabHistory.title = tab.attribute("title"); - tabHistory.url = tab.attribute("url"); - QDomCDATASection historySection = tab.firstChild().toCDATASection(); - tabHistory.history = QByteArray::fromBase64(historySection.data().toAscii()); - - if (tabNo == 0 && useFirstTab) - { - tw->loadUrl(u, Rekonq::CurrentTab, &tabHistory); - } - else - { - tw->loadUrl(u, Rekonq::NewTab, &tabHistory); - } - } - - return currentTab; -} - - -// ------------------------------------------------------------------------------------------------- - - -QWeakPointer SessionManager::s_sessionManager; - - -SessionManager *SessionManager::self() -{ - if (s_sessionManager.isNull()) - { - s_sessionManager = new SessionManager(qApp); - } - return s_sessionManager.data(); -} - - -// ---------------------------------------------------------------------------------------------- - - -SessionManager::SessionManager(QObject *parent) - : QObject(parent) - , m_safe(true) - , m_isSessionEnabled(false) - , m_saveTimer(new AutoSaver(this)) -{ - // AutoSaver. Save your hd from frying... - connect(m_saveTimer, SIGNAL(saveNeeded()), this, SLOT(save())); - - m_sessionFilePath = KStandardDirs::locateLocal("appdata" , "session"); -} - - -void SessionManager::saveSession() -{ - if (!m_isSessionEnabled) - return; - - m_saveTimer->changeOccurred(); -} - - -void SessionManager::save() -{ - if (!m_isSessionEnabled || !m_safe) - return; - - m_safe = false; - - kDebug() << "SAVING SESSION..."; - - QFile sessionFile(m_sessionFilePath); - if (!sessionFile.open(QFile::WriteOnly | QFile::Truncate)) - { - kDebug() << "Unable to open session file" << sessionFile.fileName(); - return; - } - TabWindowList wl = rApp->tabWindowList(); - QDomDocument document("session"); - QDomElement session = document.createElement("session"); - document.appendChild(session); - - Q_FOREACH(const QWeakPointer &w, wl) - { - QDomElement window = document.createElement("window"); - int tabInserted = 0; - - window.setAttribute("name", w.data()->objectName()); - - for (signed int tabNo = 0; tabNo < w.data()->count(); tabNo++) - { - KUrl u = w.data()->webWindow(tabNo)->url(); - - tabInserted++; - QDomElement tab = document.createElement("tab"); - tab.setAttribute("title", w.data()->webWindow(tabNo)->title()); // redundant, but needed for closedSites() - // as there's not way to read out the historyData - tab.setAttribute("url", u.url()); - if (w.data()->currentIndex() == tabNo) - { - tab.setAttribute("currentTab", 1); - } - QByteArray history; - QDataStream historyStream(&history, QIODevice::ReadWrite); - historyStream << *(w.data()->webWindow(tabNo)->page()->history()); - QDomCDATASection historySection = document.createCDATASection(history.toBase64()); - - tab.appendChild(historySection); - window.appendChild(tab); - } - if (tabInserted > 0) - session.appendChild(window); - } - - QTextStream TextStream(&sessionFile); - document.save(TextStream, 2); - sessionFile.close(); - - m_safe = true; - return; -} - - -bool SessionManager::restoreSessionFromScratch() -{ - QDomDocument document("session"); - - if (!readSessionDocument(document, m_sessionFilePath)) - return false; - - for (unsigned int winNo = 0; winNo < document.elementsByTagName("window").length(); winNo++) - { - QDomElement window = document.elementsByTagName("window").at(winNo).toElement(); - - TabWindow *tw = rApp->newTabWindow(); - - int currentTab = loadTabs(tw, window, false); - - tw->setCurrentIndex(currentTab); - } - - return true; -} - - -void SessionManager::restoreCrashedSession() -{ - QDomDocument document("session"); - - if (!readSessionDocument(document, m_sessionFilePath)) - return; - - for (unsigned int winNo = 0; winNo < document.elementsByTagName("window").length(); winNo++) - { - QDomElement window = document.elementsByTagName("window").at(winNo).toElement(); - - TabWindow *tw = (winNo == 0) - ? rApp->tabWindow() - : rApp->newTabWindow(); - - KUrl u = tw->currentWebWindow()->url(); - bool useCurrentTab = (u.isEmpty() || u.protocol() == QL1S("about")); - int currentTab = loadTabs(tw, window, useCurrentTab); - - tw->setCurrentIndex(currentTab); - } - - setSessionManagementEnabled(true); -} - - -int SessionManager::restoreSavedSession() -{ - QDomDocument document("session"); - - if (!readSessionDocument(document, m_sessionFilePath)) - return 0; - - unsigned int winNo; - - for (winNo = 0; winNo < document.elementsByTagName("window").length(); winNo++) - { - QDomElement window = document.elementsByTagName("window").at(winNo).toElement(); - - TabWindow *tw = rApp->newTabWindow(); - - int currentTab = loadTabs(tw, window, true); - - tw->setCurrentIndex(currentTab); - } - - return winNo; -} - - -bool SessionManager::restoreTabWindow(TabWindow* window) -{ - QDomDocument document("session"); - - if (!readSessionDocument(document, m_sessionFilePath)) - return false; - - unsigned int winNo; - - for (winNo = 0; winNo < document.elementsByTagName("window").length(); winNo++) - { - QDomElement savedWindowElement = document.elementsByTagName("window").at(winNo).toElement(); - - if (window->objectName() != savedWindowElement.attribute("name", "")) - continue; - - int currentTab = loadTabs(window, savedWindowElement, false); - - window->setCurrentIndex(currentTab); - - return true; - } - - return false; -} - - -QList SessionManager::closedSites() -{ - QList list; - QDomDocument document("session"); - - if (!readSessionDocument(document, m_sessionFilePath)) - return list; - - for (unsigned int tabNo = 0; tabNo < document.elementsByTagName("tab").length(); tabNo++) - { - QDomElement tab = document.elementsByTagName("tab").at(tabNo).toElement(); - - TabHistory tabHistory; - - tabHistory.title = tab.attribute("title"); - tabHistory.url = tab.attribute("url"); - - QDomCDATASection historySection = tab.firstChild().toCDATASection(); - tabHistory.history = QByteArray::fromBase64(historySection.data().toAscii()); - - list << tabHistory; - } - - return list; -} diff --git a/src/session/sessionmanager.h b/src/session/sessionmanager.h deleted file mode 100644 index abf39197..00000000 --- a/src/session/sessionmanager.h +++ /dev/null @@ -1,104 +0,0 @@ -/* ============================================================ -* -* This file is a part of the rekonq project -* -* Copyright (C) 2009-2012 by Andrea Diamantini -* Copyright (C) 2009 by Yoram Bar-Haim < -* Copyright (C) 2009-2011 by Lionel Chauvin -* -* -* 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 . -* -* ============================================================ */ - - -#ifndef SESSION_MANAGER_H -#define SESSION_MANAGER_H - - -// Rekonq Includes -#include "rekonq_defines.h" - -// Qt Includes -#include -#include -#include - -// Forward Declarations -class AutoSaver; -class TabHistory; -class TabWindow; - - -/** - * Session Management: Needs clean up :) - * - */ -class REKONQ_TESTS_EXPORT SessionManager : public QObject -{ - Q_OBJECT - -public: - /** - * Entry point. - * Access to SessionManager class by using - * SessionManager::self()->thePublicMethodYouNeed() - */ - static SessionManager *self(); - - inline void setSessionManagementEnabled(bool on) - { - m_isSessionEnabled = on; - } - - QList closedSites(); - - // This method restores session - // while turning back from Private mode - int restoreSavedSession(); - - // This method restores a single TabWindow - bool restoreTabWindow(TabWindow * window); - -private: - SessionManager(QObject *parent = 0); - -public Q_SLOTS: - // This method restores session - // on restart when restore at startup is chosen - bool restoreSessionFromScratch(); - -private Q_SLOTS: - void saveSession(); - void save(); - - // This method restores session - // after a crash - void restoreCrashedSession(); - -private: - QString m_sessionFilePath; - - bool m_safe; - bool m_isSessionEnabled; - AutoSaver *m_saveTimer; - - static QWeakPointer s_sessionManager; -}; - - -#endif // SESSION_MANAGER_H diff --git a/src/sessionmanager.cpp b/src/sessionmanager.cpp new file mode 100644 index 00000000..771aca55 --- /dev/null +++ b/src/sessionmanager.cpp @@ -0,0 +1,331 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2009-2012 by Andrea Diamantini +* Copyright (C) 2009 by Yoram Bar-Haim < +* Copyright (C) 2009-2011 by Lionel Chauvin +* +* +* 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 . +* +* ============================================================ */ + + +// Self Includes +#include "sessionmanager.h" +#include "sessionmanager.moc" + +// Local Includes +#include "application.h" +#include "autosaver.h" +#include "tabhistory.h" +#include "tabwindow.h" +#include "webwindow.h" +#include "webpage.h" + +// KDE Includes +#include +#include + +// Qt Includes +#include +#include + + +// Only used internally +bool readSessionDocument(QDomDocument & document, const QString & sessionFilePath) +{ + QFile sessionFile(sessionFilePath); + + if (!sessionFile.exists()) + return false; + + if (!sessionFile.open(QFile::ReadOnly)) + { + kDebug() << "Unable to open session file" << sessionFile.fileName(); + return false; + } + + if (!document.setContent(&sessionFile, false)) + { + kDebug() << "Unable to parse session file" << sessionFile.fileName(); + return false; + } + + return true; +} + + +int loadTabs(TabWindow *tw, QDomElement & window, bool useFirstTab) +{ + int currentTab = 0; + + for (unsigned int tabNo = 0; tabNo < window.elementsByTagName("tab").length(); tabNo++) + { + QDomElement tab = window.elementsByTagName("tab").at(tabNo).toElement(); + if (tab.hasAttribute("currentTab")) + currentTab = tabNo; + + KUrl u = KUrl(tab.attribute("url")); + + TabHistory tabHistory; + tabHistory.title = tab.attribute("title"); + tabHistory.url = tab.attribute("url"); + QDomCDATASection historySection = tab.firstChild().toCDATASection(); + tabHistory.history = QByteArray::fromBase64(historySection.data().toAscii()); + + if (tabNo == 0 && useFirstTab) + { + tw->loadUrl(u, Rekonq::CurrentTab, &tabHistory); + } + else + { + tw->loadUrl(u, Rekonq::NewTab, &tabHistory); + } + } + + return currentTab; +} + + +// ------------------------------------------------------------------------------------------------- + + +QWeakPointer SessionManager::s_sessionManager; + + +SessionManager *SessionManager::self() +{ + if (s_sessionManager.isNull()) + { + s_sessionManager = new SessionManager(qApp); + } + return s_sessionManager.data(); +} + + +// ---------------------------------------------------------------------------------------------- + + +SessionManager::SessionManager(QObject *parent) + : QObject(parent) + , m_safe(true) + , m_isSessionEnabled(false) + , m_saveTimer(new AutoSaver(this)) +{ + // AutoSaver. Save your hd from frying... + connect(m_saveTimer, SIGNAL(saveNeeded()), this, SLOT(save())); + + m_sessionFilePath = KStandardDirs::locateLocal("appdata" , "session"); +} + + +void SessionManager::saveSession() +{ + if (!m_isSessionEnabled) + return; + + m_saveTimer->changeOccurred(); +} + + +void SessionManager::save() +{ + if (!m_isSessionEnabled || !m_safe) + return; + + m_safe = false; + + kDebug() << "SAVING SESSION..."; + + QFile sessionFile(m_sessionFilePath); + if (!sessionFile.open(QFile::WriteOnly | QFile::Truncate)) + { + kDebug() << "Unable to open session file" << sessionFile.fileName(); + return; + } + TabWindowList wl = rApp->tabWindowList(); + QDomDocument document("session"); + QDomElement session = document.createElement("session"); + document.appendChild(session); + + Q_FOREACH(const QWeakPointer &w, wl) + { + QDomElement window = document.createElement("window"); + int tabInserted = 0; + + window.setAttribute("name", w.data()->objectName()); + + for (signed int tabNo = 0; tabNo < w.data()->count(); tabNo++) + { + KUrl u = w.data()->webWindow(tabNo)->url(); + + tabInserted++; + QDomElement tab = document.createElement("tab"); + tab.setAttribute("title", w.data()->webWindow(tabNo)->title()); // redundant, but needed for closedSites() + // as there's not way to read out the historyData + tab.setAttribute("url", u.url()); + if (w.data()->currentIndex() == tabNo) + { + tab.setAttribute("currentTab", 1); + } + QByteArray history; + QDataStream historyStream(&history, QIODevice::ReadWrite); + historyStream << *(w.data()->webWindow(tabNo)->page()->history()); + QDomCDATASection historySection = document.createCDATASection(history.toBase64()); + + tab.appendChild(historySection); + window.appendChild(tab); + } + if (tabInserted > 0) + session.appendChild(window); + } + + QTextStream TextStream(&sessionFile); + document.save(TextStream, 2); + sessionFile.close(); + + m_safe = true; + return; +} + + +bool SessionManager::restoreSessionFromScratch() +{ + QDomDocument document("session"); + + if (!readSessionDocument(document, m_sessionFilePath)) + return false; + + for (unsigned int winNo = 0; winNo < document.elementsByTagName("window").length(); winNo++) + { + QDomElement window = document.elementsByTagName("window").at(winNo).toElement(); + + TabWindow *tw = rApp->newTabWindow(); + + int currentTab = loadTabs(tw, window, false); + + tw->setCurrentIndex(currentTab); + } + + return true; +} + + +void SessionManager::restoreCrashedSession() +{ + QDomDocument document("session"); + + if (!readSessionDocument(document, m_sessionFilePath)) + return; + + for (unsigned int winNo = 0; winNo < document.elementsByTagName("window").length(); winNo++) + { + QDomElement window = document.elementsByTagName("window").at(winNo).toElement(); + + TabWindow *tw = (winNo == 0) + ? rApp->tabWindow() + : rApp->newTabWindow(); + + KUrl u = tw->currentWebWindow()->url(); + bool useCurrentTab = (u.isEmpty() || u.protocol() == QL1S("about")); + int currentTab = loadTabs(tw, window, useCurrentTab); + + tw->setCurrentIndex(currentTab); + } + + setSessionManagementEnabled(true); +} + + +int SessionManager::restoreSavedSession() +{ + QDomDocument document("session"); + + if (!readSessionDocument(document, m_sessionFilePath)) + return 0; + + unsigned int winNo; + + for (winNo = 0; winNo < document.elementsByTagName("window").length(); winNo++) + { + QDomElement window = document.elementsByTagName("window").at(winNo).toElement(); + + TabWindow *tw = rApp->newTabWindow(); + + int currentTab = loadTabs(tw, window, true); + + tw->setCurrentIndex(currentTab); + } + + return winNo; +} + + +bool SessionManager::restoreTabWindow(TabWindow* window) +{ + QDomDocument document("session"); + + if (!readSessionDocument(document, m_sessionFilePath)) + return false; + + unsigned int winNo; + + for (winNo = 0; winNo < document.elementsByTagName("window").length(); winNo++) + { + QDomElement savedWindowElement = document.elementsByTagName("window").at(winNo).toElement(); + + if (window->objectName() != savedWindowElement.attribute("name", "")) + continue; + + int currentTab = loadTabs(window, savedWindowElement, false); + + window->setCurrentIndex(currentTab); + + return true; + } + + return false; +} + + +QList SessionManager::closedSites() +{ + QList list; + QDomDocument document("session"); + + if (!readSessionDocument(document, m_sessionFilePath)) + return list; + + for (unsigned int tabNo = 0; tabNo < document.elementsByTagName("tab").length(); tabNo++) + { + QDomElement tab = document.elementsByTagName("tab").at(tabNo).toElement(); + + TabHistory tabHistory; + + tabHistory.title = tab.attribute("title"); + tabHistory.url = tab.attribute("url"); + + QDomCDATASection historySection = tab.firstChild().toCDATASection(); + tabHistory.history = QByteArray::fromBase64(historySection.data().toAscii()); + + list << tabHistory; + } + + return list; +} diff --git a/src/sessionmanager.h b/src/sessionmanager.h new file mode 100644 index 00000000..abf39197 --- /dev/null +++ b/src/sessionmanager.h @@ -0,0 +1,104 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2009-2012 by Andrea Diamantini +* Copyright (C) 2009 by Yoram Bar-Haim < +* Copyright (C) 2009-2011 by Lionel Chauvin +* +* +* 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 . +* +* ============================================================ */ + + +#ifndef SESSION_MANAGER_H +#define SESSION_MANAGER_H + + +// Rekonq Includes +#include "rekonq_defines.h" + +// Qt Includes +#include +#include +#include + +// Forward Declarations +class AutoSaver; +class TabHistory; +class TabWindow; + + +/** + * Session Management: Needs clean up :) + * + */ +class REKONQ_TESTS_EXPORT SessionManager : public QObject +{ + Q_OBJECT + +public: + /** + * Entry point. + * Access to SessionManager class by using + * SessionManager::self()->thePublicMethodYouNeed() + */ + static SessionManager *self(); + + inline void setSessionManagementEnabled(bool on) + { + m_isSessionEnabled = on; + } + + QList closedSites(); + + // This method restores session + // while turning back from Private mode + int restoreSavedSession(); + + // This method restores a single TabWindow + bool restoreTabWindow(TabWindow * window); + +private: + SessionManager(QObject *parent = 0); + +public Q_SLOTS: + // This method restores session + // on restart when restore at startup is chosen + bool restoreSessionFromScratch(); + +private Q_SLOTS: + void saveSession(); + void save(); + + // This method restores session + // after a crash + void restoreCrashedSession(); + +private: + QString m_sessionFilePath; + + bool m_safe; + bool m_isSessionEnabled; + AutoSaver *m_saveTimer; + + static QWeakPointer s_sessionManager; +}; + + +#endif // SESSION_MANAGER_H -- cgit v1.2.1