aboutsummaryrefslogtreecommitdiff
path: root/eventemitter.h
blob: b81778b608548e82bc42c923437f839481219f91 (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
#pragma once

#include <QThread>
#include <QObject>

#include <iostream>
#include <deltachat.h>
#include "dcevent.h"

class EventLoopThread : public QThread
{
    Q_OBJECT

    dc_accounts_event_emitter_t *m_eventEmitter;
    void run() override {
        dc_event_t *event;
        while((event = dc_accounts_get_next_event(m_eventEmitter))) {
            emit emitEvent(new DcEvent{event});
        }
        dc_accounts_event_emitter_unref(m_eventEmitter);

        std::cout << "NO MORE EVENTS!" << std::endl;
    }
public:
    explicit EventLoopThread(QObject *parent = nullptr)
        : QThread{parent}
    {
    }
    void setEventEmitter(dc_accounts_event_emitter_t *eventEmitter)
    {
        m_eventEmitter = eventEmitter;
    }

signals:
    void emitEvent(DcEvent *event);
};

class DcAccountsEventEmitter : public QObject {
    Q_OBJECT

    dc_accounts_event_emitter_t *m_accounts_event_emitter{nullptr};
    EventLoopThread *m_eventLoopThread{nullptr};
public:
    explicit DcAccountsEventEmitter(QObject *parent = nullptr);
    explicit DcAccountsEventEmitter(dc_accounts_event_emitter_t *emitter);
    ~DcAccountsEventEmitter();

    Q_INVOKABLE void start();
    Q_INVOKABLE void processEvent(DcEvent *event);

signals:
    void chatModified(uint32_t accountId, int chatId);
    void incomingMessage(uint32_t accountId, int chatId, int msgId);
    void messagesChanged(uint32_t accountId, int chatId, int msgId);
    void messagesNoticed(uint32_t accountId, int chatId);
    void incomingEvent();
};