From 0b9cf8c968a89784b5c2b8afe1a819b33749165e Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Wed, 28 Nov 2018 12:39:14 +0100 Subject: Rewrite Session saving and loading --- src/session/session.cpp | 95 +++++++++++++++++++++++++++++++++++++++---- src/session/session.h | 12 +++++- src/session/sessiondialog.cpp | 2 +- 3 files changed, 98 insertions(+), 11 deletions(-) (limited to 'src/session') diff --git a/src/session/session.cpp b/src/session/session.cpp index d728d55..0853c70 100644 --- a/src/session/session.cpp +++ b/src/session/session.cpp @@ -7,15 +7,17 @@ */ #include "session.h" +#include "../webengine/webview.h" +#include "browser.h" #include "mainwindow/mainwindow.h" +#include "profilemanager.h" #include "subwindow/subwindow.h" -#include -#include #include "webengine/webview.h" -#include "profilemanager.h" -#include "browser.h" -#include "../webengine/webview.h" +#include +#include #include +#include +#include "configuration.h" QJsonObject Session::session(QVector windows) { @@ -81,6 +83,58 @@ QJsonObject Session::window(const QString &profile, const QStringList &urls) return session; } +////// + +QJsonObject Session::_session(const QVector windows) +{ + QJsonObject sessionData; + + { + QJsonArray windowList; + for(const auto *window : windows) { + windowList.append(Session::_window(window)); + } + sessionData.insert("windows", windowList); + } + + return sessionData; +} + +QJsonObject Session::_window(const MainWindow *window) +{ + QJsonObject windowData; + + { + QJsonArray subwindows; + for(const auto *subwindow : window->subWindows()) { + subwindows.append(Session::_subwindow(subwindow)); + } + windowData.insert("subwindows", subwindows); + } + + return windowData; +} + +QJsonObject Session::_subwindow(const SubWindow *subwindow) +{ + auto *profileManager = dynamic_cast(qApp)->getProfileManager(); + Q_CHECK_PTR(profileManager); + + QJsonObject subwindowData; + + subwindowData.insert("profile", profileManager->id(subwindow->profile())); + + { + QJsonArray tabs; + for(int i = 0; i < subwindow->tabCount(); ++i) { + tabs.append(Session::view(subwindow->view(i))); + } + subwindowData.insert("tabs", tabs); + } + + return subwindowData; +} + QJsonObject Session::view(const WebView *view) { auto *profileManager = dynamic_cast(qApp)->getProfileManager(); @@ -91,10 +145,10 @@ QJsonObject Session::view(const WebView *view) historyStream << *view->history(); QJsonObject viewData; - viewData.insert("url", view->url().toString()); viewData.insert("profile", profileManager->id(view->profile())); - //viewData.insert("history", QString(qCompress(historyData).toBase64())); - viewData.insert("history", QString(historyData.toBase64())); + + // store history: compress, toBase64 (to make printable), toQString (to store in json) + viewData.insert("history", QString(qCompress(historyData).toBase64())); return viewData; } @@ -108,7 +162,30 @@ void Session::restoreView(WebView *view, const QJsonObject &data) if(profile) view->setProfile(profile); - QByteArray historyData = QByteArray::fromBase64(data["history"].toString().toLatin1()); + // restore history: toLatin1 (turn into bytearray), fromBase64, uncompress + QByteArray historyData = qUncompress(QByteArray::fromBase64(data["history"].toString().toLatin1())); QDataStream historyStream(&historyData, QIODevice::ReadOnly); historyStream >> *view->history(); } + +void Session::restoreSession(const QJsonObject &sessionData) +{ + auto *browser = dynamic_cast(qApp); + Q_CHECK_PTR(browser); + auto *profileManager = browser->getProfileManager(); + Q_CHECK_PTR(profileManager); + + for(const auto windowData : sessionData["windows"].toArray()) { + auto *window = browser->createWindow(); + + for(const auto subwindowData : windowData.toObject()["subwindows"].toArray()) { + auto *subwindow = window->createSubWindow(browser->getConfiguration(), WebProfile::defaultProfile()); + subwindow->setProfile(profileManager->profile(subwindowData.toObject()["profile"].toString())); + + for(const auto tabData : subwindowData.toObject()["tabs"].toArray()) { + auto *view = subwindow->view(subwindow->addTab()); + Session::restoreView(view, tabData.toObject()); + } + } + } +} diff --git a/src/session/session.h b/src/session/session.h index 222c7ef..720b711 100644 --- a/src/session/session.h +++ b/src/session/session.h @@ -12,6 +12,7 @@ #include class MainWindow; +class SubWindow; class WebView; namespace Session { @@ -19,8 +20,17 @@ QJsonObject session(QVector windows); QJsonObject window(const MainWindow *window); QJsonObject window(const QString &profile, const QStringList &urls); +// TODO: +QJsonObject _session(const QVector windows); +QJsonObject _window(const MainWindow *window); +QJsonObject _subwindow(const SubWindow *subwindow); + + QJsonObject view(const WebView *view); void restoreView(WebView *view, const QJsonObject &data); -} + +void restoreSession(const QJsonObject &sessionData); + +} // namespace Session #endif // SMOLBOTE_SESSION_H diff --git a/src/session/sessiondialog.cpp b/src/session/sessiondialog.cpp index e31a42f..5fd65c3 100644 --- a/src/session/sessiondialog.cpp +++ b/src/session/sessiondialog.cpp @@ -81,7 +81,7 @@ void SessionDialog::openSession(const QString &filename) if(json.open(QIODevice::ReadOnly | QIODevice::Text)) { auto *browser = qobject_cast(qApp); auto doc = QJsonDocument::fromJson(json.readAll()); - browser->createSession(doc.object()); + Session::restoreSession(doc.object()); json.close(); } } -- cgit v1.2.1