sdp to ice transport conversion

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/xmpp/jingle/RtpContentMap.java               |  2 
src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/IceUdpTransportInfo.java | 48 
2 files changed, 47 insertions(+), 3 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/xmpp/jingle/RtpContentMap.java 🔗

@@ -91,7 +91,7 @@ public class RtpContentMap {
 
         public static DescriptionTransport of(final SessionDescription sessionDescription, final SessionDescription.Media media) {
             final RtpDescription rtpDescription = RtpDescription.of(media);
-            final IceUdpTransportInfo transportInfo = new IceUdpTransportInfo();
+            final IceUdpTransportInfo transportInfo = IceUdpTransportInfo.of(sessionDescription, media);
             return new DescriptionTransport(rtpDescription, transportInfo);
         }
 

src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/IceUdpTransportInfo.java 🔗

@@ -1,16 +1,19 @@
 package eu.siacs.conversations.xmpp.jingle.stanzas;
 
 import com.google.common.base.Preconditions;
+import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
 
 import java.util.List;
 
 import eu.siacs.conversations.xml.Element;
 import eu.siacs.conversations.xml.Namespace;
+import eu.siacs.conversations.xmpp.jingle.SessionDescription;
 
 public class IceUdpTransportInfo extends GenericTransportInfo {
 
-    public IceUdpTransportInfo() {
+    private IceUdpTransportInfo() {
         super("transport", Namespace.JINGLE_TRANSPORT_ICE_UDP);
     }
 
@@ -21,7 +24,7 @@ public class IceUdpTransportInfo extends GenericTransportInfo {
 
     public List<Candidate> getCandidates() {
         final ImmutableList.Builder<Candidate> builder = new ImmutableList.Builder<>();
-        for(final Element child : getChildren()) {
+        for (final Element child : getChildren()) {
             if ("candidate".equals(child.getName())) {
                 builder.add(Candidate.upgrade(child));
             }
@@ -38,6 +41,24 @@ public class IceUdpTransportInfo extends GenericTransportInfo {
         return transportInfo;
     }
 
+    public static IceUdpTransportInfo of(SessionDescription sessionDescription, SessionDescription.Media media) {
+        final String ufrag = Iterables.getFirst(media.attributes.get("ice-ufrag"), null);
+        final String pwd = Iterables.getFirst(media.attributes.get("ice-pwd"), null);
+        IceUdpTransportInfo iceUdpTransportInfo = new IceUdpTransportInfo();
+        if (ufrag != null) {
+            iceUdpTransportInfo.setAttribute("ufrag", ufrag);
+        }
+        if (pwd != null) {
+            iceUdpTransportInfo.setAttribute("pwd", pwd);
+        }
+        final Fingerprint fingerprint = Fingerprint.of(sessionDescription, media);
+        if (fingerprint != null) {
+            iceUdpTransportInfo.addChild(fingerprint);
+        }
+        return iceUdpTransportInfo;
+
+    }
+
     public static class Candidate extends Element {
 
         private Candidate() {
@@ -136,5 +157,28 @@ public class IceUdpTransportInfo extends GenericTransportInfo {
             fingerprint.setContent(element.getContent());
             return fingerprint;
         }
+
+        private static Fingerprint of(ArrayListMultimap<String, String> attributes) {
+            final String fingerprint = Iterables.getFirst(attributes.get("fingerprint"), null);
+            final String setup = Iterables.getFirst(attributes.get("setup"), null);
+            if (setup != null && fingerprint != null) {
+                final String[] fingerprintParts = fingerprint.split(" ", 2);
+                if (fingerprintParts.length == 2) {
+                    final String hash = fingerprintParts[0];
+                    final String actualFingerprint = fingerprintParts[1];
+                    final Fingerprint element = new Fingerprint();
+                    element.setAttribute("hash", hash);
+                    element.setAttribute("setup", setup);
+                    element.setContent(actualFingerprint);
+                    return element;
+                }
+            }
+            return null;
+        }
+
+        public static Fingerprint of(final SessionDescription sessionDescription, final SessionDescription.Media media) {
+            final Fingerprint fingerprint = of(media.attributes);
+            return fingerprint == null ? of(sessionDescription.attributes) : fingerprint;
+        }
     }
 }