JingleConnectionManager.java

  1package eu.siacs.conversations.xmpp.jingle;
  2
  3import java.math.BigInteger;
  4import java.security.SecureRandom;
  5import java.util.ArrayList;
  6import java.util.List;
  7import java.util.concurrent.ConcurrentHashMap;
  8
  9import android.util.Log;
 10
 11import eu.siacs.conversations.entities.Account;
 12import eu.siacs.conversations.entities.Message;
 13import eu.siacs.conversations.services.XmppConnectionService;
 14import eu.siacs.conversations.xml.Element;
 15import eu.siacs.conversations.xmpp.OnIqPacketReceived;
 16import eu.siacs.conversations.xmpp.jingle.stanzas.JinglePacket;
 17import eu.siacs.conversations.xmpp.stanzas.IqPacket;
 18
 19public class JingleConnectionManager {
 20
 21	private XmppConnectionService xmppConnectionService;
 22
 23	private List<JingleConnection> connections = new ArrayList<JingleConnection>(); // make
 24																					// concurrent
 25
 26	private ConcurrentHashMap<String, Element> primaryCandidates = new ConcurrentHashMap<String, Element>();
 27
 28	private SecureRandom random = new SecureRandom();
 29
 30	public JingleConnectionManager(XmppConnectionService service) {
 31		this.xmppConnectionService = service;
 32	}
 33
 34	public void deliverPacket(Account account, JinglePacket packet) {
 35		for (JingleConnection connection : connections) {
 36			if (connection.getAccountJid().equals(account.getJid()) && connection
 37					.getSessionId().equals(packet.getSessionId()) && connection
 38					.getCounterPart().equals(packet.getFrom())) {
 39				connection.deliverPacket(packet);
 40				return;
 41			}
 42		}
 43		Log.d("xmppService","delivering packet failed "+packet.toString());
 44	}
 45
 46	public JingleConnection createNewConnection(Message message) {
 47		Account account = message.getConversation().getAccount();
 48		JingleConnection connection = new JingleConnection(this);
 49		connection.init(message);
 50		connections.add(connection);
 51		return connection;
 52	}
 53
 54	public JingleConnection createNewConnection(JinglePacket packet) {
 55		JingleConnection connection = new JingleConnection(this);
 56		connections.add(connection);
 57		return connection;
 58	}
 59
 60	private String generateInternalId(String account, String counterpart,
 61			String sid) {
 62		return account + "#" + counterpart + "#" + sid;
 63
 64	}
 65
 66	public XmppConnectionService getXmppConnectionService() {
 67		return this.xmppConnectionService;
 68	}
 69
 70	public void getPrimaryCandidate(Account account,
 71			final OnPrimaryCandidateFound listener) {
 72		if (!this.primaryCandidates.containsKey(account.getJid())) {
 73			String xmlns = "http://jabber.org/protocol/bytestreams";
 74			final String proxy = account.getXmppConnection()
 75					.findDiscoItemByFeature(xmlns);
 76			if (proxy != null) {
 77				IqPacket iq = new IqPacket(IqPacket.TYPE_GET);
 78				iq.setTo(proxy);
 79				iq.query(xmlns);
 80				account.getXmppConnection().sendIqPacket(iq,
 81						new OnIqPacketReceived() {
 82
 83							@Override
 84							public void onIqPacketReceived(Account account,
 85									IqPacket packet) {
 86								Element streamhost = packet
 87										.query()
 88										.findChild("streamhost",
 89												"http://jabber.org/protocol/bytestreams");
 90								if (streamhost != null) {
 91									Log.d("xmppService", "streamhost found "
 92											+ streamhost.toString());
 93									Element candidate = new Element("candidate");
 94									candidate.setAttribute("cid",
 95											nextRandomId());
 96									candidate.setAttribute("host",
 97											streamhost.getAttribute("host"));
 98									candidate.setAttribute("port",
 99											streamhost.getAttribute("port"));
100									candidate.setAttribute("type", "proxy");
101									candidate.setAttribute("jid", proxy);
102									candidate
103											.setAttribute("priority", "655360");
104									primaryCandidates.put(account.getJid(),
105											candidate);
106									listener.onPrimaryCandidateFound(true,
107											candidate);
108								} else {
109									listener.onPrimaryCandidateFound(false,
110											null);
111								}
112							}
113						});
114			} else {
115				listener.onPrimaryCandidateFound(false, null);
116			}
117
118		} else {
119			listener.onPrimaryCandidateFound(true,
120					this.primaryCandidates.get(account.getJid()));
121		}
122	}
123
124	public String nextRandomId() {
125		return new BigInteger(50, random).toString(32);
126	}
127}