aboutsummaryrefslogtreecommitdiff
path: root/client/src/service/stream_interactor.vala
blob: 56591cf09bfa1afadb1a08c77d9cb6e6a61d596e (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
using Gee;

using Xmpp;
using Dino.Entities;

namespace Dino {
public class StreamInteractor {

    public signal void account_added(Account account);
    public signal void stream_negotiated(Account account);

    public ModuleManager module_manager;
    public ConnectionManager connection_manager;
    private ArrayList<StreamInteractionModule> interaction_modules = new ArrayList<StreamInteractionModule>();

    public StreamInteractor(Database db) {
        module_manager = new ModuleManager(db);
        connection_manager = new ConnectionManager(module_manager);

        connection_manager.stream_opened.connect(on_stream_opened);
    }

    public void connect(Account account) {
        module_manager.add_account(account);
        account_added(account);
        connection_manager.connect(account);
    }

    public void disconnect(Account account) {
        connection_manager.disconnect(account);
    }

    public ArrayList<Account> get_accounts() {
        ArrayList<Account> ret = new ArrayList<Account>(Account.equals_func);
        foreach (Account account in connection_manager.get_managed_accounts()) {
            ret.add(account);
        }
        return ret;
    }

    public Core.XmppStream? get_stream(Account account) {
        return connection_manager.get_stream(account);
    }

    public void add_module(StreamInteractionModule module) {
        interaction_modules.add(module);
    }

    public StreamInteractionModule? get_module(string id) {
        foreach (StreamInteractionModule module in interaction_modules) {
            if (module.get_id() == id) {
                return module;
            }
        }
        return null;
    }

    private void on_stream_opened(Account account, Core.XmppStream stream) {
        stream.stream_negotiated.connect( (stream) => {
            stream_negotiated(account);
        });
    }
}

public interface StreamInteractionModule : Object {
    internal abstract string get_id();
}
}