1package eu.siacs.conversations.xmpp.jingle;
2
3import java.util.ArrayList;
4import java.util.Arrays;
5import java.util.Collections;
6import java.util.List;
7import java.util.Map;
8
9import eu.siacs.conversations.entities.Contact;
10import eu.siacs.conversations.entities.Presence;
11import eu.siacs.conversations.entities.Presences;
12import eu.siacs.conversations.entities.ServiceDiscoveryResult;
13import eu.siacs.conversations.xml.Namespace;
14
15public class RtpCapability {
16
17 private static List<String> BASIC_RTP_REQUIREMENTS = Arrays.asList(
18 Namespace.JINGLE,
19 Namespace.JINGLE_TRANSPORT_ICE_UDP,
20 Namespace.JINGLE_APPS_RTP,
21 Namespace.JINGLE_APPS_DTLS
22 );
23 private static List<String> VIDEO_REQUIREMENTS = Arrays.asList(
24 Namespace.JINGLE_FEATURE_AUDIO,
25 Namespace.JINGLE_FEATURE_VIDEO
26 );
27
28 public static Capability check(final Presence presence) {
29 final ServiceDiscoveryResult disco = presence.getServiceDiscoveryResult();
30 final List<String> features = disco == null ? Collections.emptyList() : disco.getFeatures();
31 if (features.containsAll(BASIC_RTP_REQUIREMENTS)) {
32 if (features.containsAll(VIDEO_REQUIREMENTS)) {
33 return Capability.VIDEO;
34 }
35 if (features.contains(Namespace.JINGLE_FEATURE_AUDIO)) {
36 return Capability.AUDIO;
37 }
38 }
39 return Capability.NONE;
40 }
41
42 public static String[] filterPresences(final Contact contact, Capability required) {
43 final Presences presences = contact.getPresences();
44 final ArrayList<String> resources = new ArrayList<>();
45 for(final Map.Entry<String,Presence> presence : presences.getPresencesMap().entrySet()) {
46 final Capability capability = check(presence.getValue());
47 if (capability == Capability.NONE) {
48 continue;
49 }
50 if (required == Capability.AUDIO || capability == required) {
51 resources.add(presence.getKey());
52 }
53 }
54 return resources.toArray(new String[0]);
55 }
56
57 public static Capability check(final Contact contact) {
58 final Presences presences = contact.getPresences();
59 Capability result = Capability.NONE;
60 for(Presence presence : presences.getPresences()) {
61 Capability capability = check(presence);
62 if (capability == Capability.VIDEO) {
63 result = capability;
64 } else if (capability == Capability.AUDIO && result == Capability.NONE) {
65 result = capability;
66 }
67 }
68 return result;
69 }
70
71 public enum Capability {
72 NONE, AUDIO, VIDEO
73 }
74
75}