aboutsummaryrefslogtreecommitdiff
path: root/lib/session_formats/session_json.cpp
blob: 96319ac36c2825823cd649417016bb42d3564fef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/*
 * 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 <QJsonArray>
#include <QJsonDocument>

[[nodiscard]] inline QVector<Session::MainWindow> 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<Session::MainWindow> &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<MainWindow> &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<Session::MainWindow> JsonSession::get() const
{
    QVector<Session::MainWindow> 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;
}