summaryrefslogtreecommitdiffstats
blob: 52a31f2a178e4f07842e59fee6d8bb4cc6b4be86 (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
/*
 * Copyright (c) 2010-2015, Isode Limited, London, England.
 * All rights reserved.
 */
package com.isode.stroke.disco;

import com.isode.stroke.crypto.CryptoProvider;
import com.isode.stroke.elements.CapsInfo;
import com.isode.stroke.elements.DiscoInfo;
import com.isode.stroke.presence.PayloadAddingPresenceSender;
import com.isode.stroke.presence.PresenceSender;
import com.isode.stroke.queries.IQRouter;

public class ClientDiscoManager {
    private PayloadAddingPresenceSender presenceSender;
    private CryptoProvider crypto;
    private DiscoInfoResponder discoInfoResponder;
    private String capsNode = "";
    private CapsInfo capsInfo;

    /**
     * Constructs the manager
     * 
     * \param iqRouter the router on which requests will be answered \param
     * presenceSender the presence sender to which all outgoing presence (with
     * caps information) will be sent.
     */
    public ClientDiscoManager(IQRouter iqRouter, PresenceSender presenceSender,
            CryptoProvider crypto) {
        this.crypto = crypto;
        discoInfoResponder = new DiscoInfoResponder(iqRouter);
        discoInfoResponder.start();
        this.presenceSender = new PayloadAddingPresenceSender(presenceSender);
    }

    void delete() {
        discoInfoResponder.stop();
    }

    /**
     * Needs to be called before calling setDiscoInfo().
     */
    public void setCapsNode(final String node) {
        capsNode = node;
    }

    /**
     * Sets the capabilities of the client.
     */
    public void setDiscoInfo(final DiscoInfo discoInfo) {
        capsInfo = new CapsInfoGenerator(capsNode, crypto).generateCapsInfo(discoInfo);
        discoInfoResponder.clearDiscoInfo();
        discoInfoResponder.setDiscoInfo(discoInfo);
        discoInfoResponder.setDiscoInfo(
                capsInfo.getNode() + "#" + capsInfo.getVersion(), discoInfo);
        presenceSender.setPayload(capsInfo);
    }

    /**
     * Returns the presence sender through which all outgoing presence should be
     * sent. The manager will add the necessary caps information, and forward it
     * to the presence sender passed at construction time.
     */
    public PresenceSender getPresenceSender() {
        return presenceSender;
    }

    /**
     * Called when the client is connected. This resets the presence sender,
     * such that it assumes initial presence hasn't been sent yet.
     */
    public void handleConnected() {
        presenceSender.reset();
    }

}