JingleConnectionManager.java

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