/* * 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]] inline 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]] inline 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; const auto root_array = root["windows"].toArray(); for(const auto &windowData : root_array) { Session::MainWindow window; const auto subwindows_array = windowData.toObject()["subwindows"].toArray(); for(const auto &subwindowData : subwindows_array) { Session::SubWindow subwindow; subwindow.profile = subwindowData.toObject()["profile"].toString(); const auto tabs_array = subwindowData.toObject()["tabs"].toArray(); for(const auto &tabData : tabs_array) { 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; }