blob: 6fb201c741a726ae9a58bd8f4e7fd2a1e75c72a2 (
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
|
/*
* Copyright (c) 2010-2015, Isode Limited, London, England.
* All rights reserved.
*/
package com.isode.stroke.disco;
import java.util.TreeMap;
import java.util.Map;
import com.isode.stroke.client.StanzaChannel;
import com.isode.stroke.elements.CapsInfo;
import com.isode.stroke.elements.DiscoInfo;
import com.isode.stroke.elements.ErrorPayload;
import com.isode.stroke.elements.Presence;
import com.isode.stroke.jid.JID;
import com.isode.stroke.signals.Slot1;
public class EntityCapsManager extends EntityCapsProvider {
private final CapsProvider capsProvider;
private final Map<JID, String> caps = new TreeMap<JID, String>();
public EntityCapsManager(CapsProvider capsProvider, StanzaChannel stanzaChannel) {
this.capsProvider = capsProvider;
stanzaChannel.onPresenceReceived.connect(new Slot1<Presence>() {
@Override
public void call(Presence p1) {
handlePresenceReceived(p1);
}
});
stanzaChannel.onAvailableChanged.connect(new Slot1<Boolean>() {
@Override
public void call(Boolean p1) {
handleStanzaChannelAvailableChanged(p1);
}
});
capsProvider.onCapsAvailable.connect(new Slot1<String>() {
@Override
public void call(String p1) {
handleCapsAvailable(p1);
}
});
}
private void handlePresenceReceived(Presence presence) {
JID from = presence.getFrom();
if (presence.isAvailable()) {
CapsInfo capsInfo = presence.getPayload(new CapsInfo());
if (capsInfo == null || !capsInfo.getHash().equals("sha-1") || presence.getPayload(new ErrorPayload()) != null) {
return;
}
String hash = capsInfo.getVersion();
String i = caps.get(from);
if (!hash.equals(i)) {
caps.put(from, hash);
DiscoInfo disco = capsProvider.getCaps(hash);
if (disco != null || i != null) {
onCapsChanged.emit(from);
}
}
}
else {
if (caps.remove(from) != null) {
onCapsChanged.emit(from);
}
}
}
private void handleStanzaChannelAvailableChanged(boolean available) {
if (available) {
for (JID i : caps.keySet()) {
onCapsChanged.emit(i);
}
caps.clear();
}
}
private void handleCapsAvailable(final String hash) {
// TODO: Use Boost.Bimap ?
for (JID i : caps.keySet()) {
if (caps.get(i).equals(hash)) {
onCapsChanged.emit(i);
}
}
}
public DiscoInfo getCaps(final JID jid) {
if (caps.containsKey(jid)) {
return capsProvider.getCaps(caps.get(jid));
}
return null;
}
}
|