From 298c7adcd1fabccb06d14905041cb7e008f109ad Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Tue, 8 Apr 2014 23:15:55 +0200 Subject: disocover stream hosts (xep-0065) cleaned up disco --- .../xmpp/jingle/JingleConnectionManager.java | 93 ++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 src/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java (limited to 'src/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java') diff --git a/src/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java b/src/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java new file mode 100644 index 000000000..784d90d4b --- /dev/null +++ b/src/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java @@ -0,0 +1,93 @@ +package eu.siacs.conversations.xmpp.jingle; + +import java.math.BigInteger; +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; + +import android.util.Log; + +import eu.siacs.conversations.entities.Account; +import eu.siacs.conversations.entities.Message; +import eu.siacs.conversations.services.XmppConnectionService; +import eu.siacs.conversations.xml.Element; +import eu.siacs.conversations.xmpp.OnIqPacketReceived; +import eu.siacs.conversations.xmpp.jingle.stanzas.JinglePacket; +import eu.siacs.conversations.xmpp.stanzas.IqPacket; + +public class JingleConnectionManager { + + private XmppConnectionService xmppConnectionService; + + private List connections = new ArrayList(); //make concurrent + + private ConcurrentHashMap primaryCanditates = new ConcurrentHashMap(); + + private SecureRandom random = new SecureRandom(); + + public JingleConnectionManager(XmppConnectionService service) { + this.xmppConnectionService = service; + } + + public void deliverPacket(Account account, JinglePacket packet) { + String id = generateInternalId(account.getJid(), packet.getFrom(), packet.getSessionId()); + } + + public JingleConnection createNewConnection(Message message) { + Account account = message.getConversation().getAccount(); + JingleConnection connection = new JingleConnection(this); + String id = generateInternalId(account.getJid(), message.getCounterpart(), connection.getSessionId()); + connection.init(message); + return connection; + } + + private String generateInternalId(String account, String counterpart, String sid) { + return account+"#"+counterpart+"#"+sid; + + } + + public XmppConnectionService getXmppConnectionService() { + return this.xmppConnectionService; + } + + public void getPrimaryCanditate(Account account, final OnPrimaryCanditateFound listener) { + if (!this.primaryCanditates.containsKey(account.getJid())) { + String xmlns = "http://jabber.org/protocol/bytestreams"; + String proxy = account.getXmppConnection().findDiscoItemByFeature(xmlns); + if (proxy!=null) { + IqPacket iq = new IqPacket(IqPacket.TYPE_GET); + iq.setTo(proxy); + iq.query(xmlns); + account.getXmppConnection().sendIqPacket(iq, new OnIqPacketReceived() { + + @Override + public void onIqPacketReceived(Account account, IqPacket packet) { + Element streamhost = packet.query().findChild("streamhost","http://jabber.org/protocol/bytestreams"); + if (streamhost!=null) { + Log.d("xmppService","streamhost found "+streamhost.toString()); + Element canditate = new Element("canditate"); + canditate.setAttribute("cid",nextRandomId()); + canditate.setAttribute("host", streamhost.getAttribute("host")); + canditate.setAttribute("port",streamhost.getAttribute("port")); + canditate.setAttribute("type", "proxy"); + primaryCanditates.put(account.getJid(), canditate); + listener.onPrimaryCanditateFound(true, canditate); + } else { + listener.onPrimaryCanditateFound(false, null); + } + } + }); + } else { + listener.onPrimaryCanditateFound(false, null); + } + + } else { + listener.onPrimaryCanditateFound(true, this.primaryCanditates.get(account.getJid())); + } + } + + public String nextRandomId() { + return new BigInteger(50, random).toString(32); + } +} -- cgit v1.2.3