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, JingleCandidate> primaryCandidates = new ConcurrentHashMap<String, JingleCandidate>();
 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		if (packet.isAction("session-initiate")) {
 36			JingleConnection connection = new JingleConnection(this);
 37			connection.init(account,packet);
 38			connections.add(connection);
 39		} else {
 40			for (JingleConnection connection : connections) {
 41				if (connection.getAccountJid().equals(account.getFullJid()) && connection
 42						.getSessionId().equals(packet.getSessionId()) && connection
 43						.getCounterPart().equals(packet.getFrom())) {
 44					connection.deliverPacket(packet);
 45					return;
 46				}
 47			}
 48			Log.d("xmppService","delivering packet failed "+packet.toString());
 49		}
 50	}
 51
 52	public JingleConnection createNewConnection(Message message) {
 53		JingleConnection connection = new JingleConnection(this);
 54		connection.init(message);
 55		connections.add(connection);
 56		return connection;
 57	}
 58
 59	public JingleConnection createNewConnection(JinglePacket packet) {
 60		JingleConnection connection = new JingleConnection(this);
 61		connections.add(connection);
 62		return connection;
 63	}
 64
 65	public XmppConnectionService getXmppConnectionService() {
 66		return this.xmppConnectionService;
 67	}
 68
 69	public void getPrimaryCandidate(Account account,
 70			final OnPrimaryCandidateFound listener) {
 71		if (!this.primaryCandidates.containsKey(account.getJid())) {
 72			String xmlns = "http://jabber.org/protocol/bytestreams";
 73			final String proxy = account.getXmppConnection()
 74					.findDiscoItemByFeature(xmlns);
 75			if (proxy != null) {
 76				IqPacket iq = new IqPacket(IqPacket.TYPE_GET);
 77				iq.setTo(proxy);
 78				iq.query(xmlns);
 79				account.getXmppConnection().sendIqPacket(iq,
 80						new OnIqPacketReceived() {
 81
 82							@Override
 83							public void onIqPacketReceived(Account account,
 84									IqPacket packet) {
 85								Element streamhost = packet
 86										.query()
 87										.findChild("streamhost",
 88												"http://jabber.org/protocol/bytestreams");
 89								if (streamhost != null) {
 90									Log.d("xmppService", "streamhost found "
 91											+ streamhost.toString());
 92									JingleCandidate candidate = new JingleCandidate(nextRandomId(),true);
 93									candidate.setHost(streamhost.getAttribute("host"));
 94									candidate.setPort(Integer.parseInt(streamhost.getAttribute("port")));
 95									candidate.setType(JingleCandidate.TYPE_PROXY);
 96									candidate.setJid(proxy);
 97									candidate.setPriority(655360+65535);
 98									primaryCandidates.put(account.getJid(),
 99											candidate);
100									listener.onPrimaryCandidateFound(true,
101											candidate);
102								} else {
103									listener.onPrimaryCandidateFound(false,
104											null);
105								}
106							}
107						});
108			} else {
109				listener.onPrimaryCandidateFound(false, null);
110			}
111
112		} else {
113			listener.onPrimaryCandidateFound(true,
114					this.primaryCandidates.get(account.getJid()));
115		}
116	}
117
118	public String nextRandomId() {
119		return new BigInteger(50, random).toString(32);
120	}
121	
122	public long getAutoAcceptFileSize() {
123		String config = this.xmppConnectionService.getPreferences().getString("auto_accept_file_size", "0");
124		try {
125			return Long.parseLong(config);
126		} catch (NumberFormatException e) {
127			return 0;
128		}
129	}
130}