summaryrefslogtreecommitdiff
path: root/jiddb.h
blob: 6c9dcb8044a274555afd2646a77b56f5ba326190 (plain) (blame)
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
104
105
106
107
108
109
110
111
112
113
114
#ifndef JID_DB_H
#define JID_DB_H

#include "direction.h"
#include <QByteArray>
#include <QDateTime>
#include <QList>
#include <QObject>
#include <QPair>
#include <QString>
#include <QStringList>
#include <QSqlDatabase>
#include <QXmppOmemoStorage.h>
#include <QVariant>
#include <optional>

class JidDb : public QObject
{
    Q_OBJECT

public:
    struct Message
    {
        Direction direction;
        QDateTime dt;
        QString contact, body;
    };

    struct Conversation
    {
        Conversation(const QString &to, const QString &last_msg,
            const QDateTime &dt) :
            to(to), last_msg(last_msg), dt(dt) {}
        QString to, last_msg;
        QDateTime dt;
    };

    struct Trust
    {
        QString security_policy;
    };

    struct Keys
    {
        Keys() {}
        Keys(const QString &owner, const QString &trust_level,
            const QList<QByteArray> &keys) :
            owner(owner),
            trust_level(trust_level),
            keys(keys)
            {}
        QString owner, trust_level;
        QList<QByteArray> keys;
    };

    struct OmemoDevice
    {
        QString jid;
        QHash<uint32_t, QXmppOmemoStorage::Device> devices;
    };

    JidDb(const QString &jid);
    QStringList roster() const;
    const QString &jid;

public Q_SLOTS:
    QList<Conversation> conversations() const;
    QList<Message> messages(const QString &jid,
        int tail = -1) const;
    QList<Keys> keys(const QString &encryption) const;
    QString securityPolicy(const QString &encryption) const;
    QList<OmemoDevice> omemoDevices() const;
    std::optional<QXmppOmemoStorage::OwnDevice> omemoOwnDevice() const;
    QHash<uint32_t, QXmppOmemoStorage::SignedPreKeyPair> signedPreKeyPairs()
        const;
    QHash<uint32_t, QByteArray> preKeyPairs() const;
    QByteArray ownKeyId(const QString &encryption) const;
    int addToRoster(const QString &jid);
    int addToRoster(const QStringList &roster);
    int store(const Message &msg) const;
    int store(const QString &encryption,
        const QString &securityPolicy) const;
    int store(const QString &encryption, const Keys &keys) const;
    int store(const QString &jid, uint32_t id,
        const QXmppOmemoStorage::Device &d) const;
    int store(uint32_t id, const QXmppOmemoStorage::SignedPreKeyPair &spk) const;
    int store(const QHash<uint32_t, QByteArray> &pairs) const;
    int store(const QXmppOmemoStorage::OwnDevice &own) const;
    int store(const QString &encryption, const QByteArray &ownId) const;
    void removeKeys(const QString &encryption) const;
    void removeOmemoDevice(const QString &jid, uint32_t id) const;
    void removeOmemoDevices(const QString &jid) const;
    void removeOmemo() const;
    void removeSignedPreKeyPair(uint32_t id) const;
    void removePreKeyPair(uint32_t id) const;

Q_SIGNALS:
    void addedToRoster(QString jid);

private:
    QSqlDatabase db;
    int ensureSecurityPolicyTable(const QString &encryption,
        QString &table) const;
    int ensureContactTable(const QString &jid) const;
    int ensureKeysTable(const QString &encryption, QString &table) const;
    int ensureOmemoDeviceTable() const;
    int ensureOmemoSignedPreKeyTable() const;
    int ensureOmemoPreKeyTable() const;
    int ensureOmemoOwnDeviceTable() const;
    int ensureOwnIdTable(const QString &encryption, QString &table) const;
    QStringList tables() const;
};

#endif