From 396bc0c1721af8d3ee970228e7df457f6b2c73d5 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Mon, 13 Apr 2020 15:44:09 +0300 Subject: Rewrite Session backend Add session.hpp, containing structs that describe session data MainWindow, SubWindow and WebView can be created from Session::structs Opening new window will automatically open a default subwindow and tab if none were specified Add lib/session_formats Add JsonSession, to serialize/deserialize Session structs into JSON - add some tests clang-tidy: - fix various warnings - disable modernize-use-trailing-return-type check --- lib/session_formats/session_json.cpp | 97 ++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 lib/session_formats/session_json.cpp (limited to 'lib/session_formats/session_json.cpp') diff --git a/lib/session_formats/session_json.cpp b/lib/session_formats/session_json.cpp new file mode 100644 index 0000000..eca96f2 --- /dev/null +++ b/lib/session_formats/session_json.cpp @@ -0,0 +1,97 @@ +/* + * This file is part of smolbote. It's copyrighted by the contributors recorded + * in the version control history of the file, available from its original + * location: https://library.iserlohn-fortress.net/aqua/smolbote + * + * SPDX-License-Identifier: GPL-3.0 + */ + +#include "session_json.hpp" +#include +#include + +[[nodiscard]] QVector toWindowList(const QString &profile, const QStringList &urls) +{ + Session::SubWindow main_; + main_.profile = profile; + for(const auto &url : urls) { + main_.tabs.append({ profile, url, QByteArray() }); + } + Session::MainWindow main; + main.subwindows.append(main_); + return { main }; +} + +[[nodiscard]] QJsonObject toJson(const QVector &windows) +{ + QJsonObject root; + QJsonArray windows_; + { + for(const auto &window : windows) { + QJsonObject window_; + QJsonArray subwindows; + for(const auto &subwindow : window.subwindows) { + QJsonObject subwindow_json; + subwindow_json.insert("profile", subwindow.profile); + QJsonArray tabs; + for(const auto &tab : subwindow.tabs) { + QJsonObject tab_; + tab_.insert("profile", tab.profile); + tab_.insert("url", tab.url); + tab_.insert("history", QString::fromLatin1(tab.history.toBase64())); + tabs.append(tab_); + } + subwindow_json.insert("tabs", tabs); + subwindows.append(subwindow_json); + } + window_.insert("subwindows", subwindows); + windows_.append(window_); + } + } + root.insert("windows", windows_); + return root; +} + +JsonSession::JsonSession(const QByteArray &data) + : root(QJsonDocument::fromJson(data).object()) +{ +} + +JsonSession::JsonSession(const QVector &windows) + : root(toJson(windows)) +{ +} + +JsonSession::JsonSession(const QString &profile, const QStringList &urls) + : root(toJson(toWindowList(profile, urls))) +{ +} + +QByteArray JsonSession::serialize() const +{ + QJsonDocument doc(root); + return doc.toJson(QJsonDocument::Compact); +} + +QVector JsonSession::get() const +{ + QVector windows; + for(const auto &windowData : root["windows"].toArray()) { + Session::MainWindow window; + for(const auto &subwindowData : windowData.toObject()["subwindows"].toArray()) { + Session::SubWindow subwindow; + subwindow.profile = subwindowData.toObject()["profile"].toString(); + for(const auto &tabData : subwindowData.toObject()["tabs"].toArray()) { + Session::WebView tab{ + tabData.toObject()["profile"].toString(), + tabData.toObject()["url"].toString(), + QByteArray::fromBase64(tabData.toObject()["history"].toString().toLatin1()) + }; + subwindow.tabs.append(tab); + } + window.subwindows.append(subwindow); + } + windows.append(window); + } + return windows; +} -- cgit v1.2.1