JingleConnection.java

  1package eu.siacs.conversations.xmpp.jingle;
  2
  3import java.util.ArrayList;
  4import java.util.List;
  5
  6import android.util.Log;
  7
  8import eu.siacs.conversations.entities.Account;
  9import eu.siacs.conversations.entities.Message;
 10import eu.siacs.conversations.services.XmppConnectionService;
 11import eu.siacs.conversations.xml.Element;
 12import eu.siacs.conversations.xmpp.OnIqPacketReceived;
 13import eu.siacs.conversations.xmpp.jingle.stanzas.Content;
 14import eu.siacs.conversations.xmpp.jingle.stanzas.JinglePacket;
 15import eu.siacs.conversations.xmpp.stanzas.IqPacket;
 16
 17public class JingleConnection {
 18
 19	private JingleConnectionManager mJingleConnectionManager;
 20	private XmppConnectionService mXmppConnectionService;
 21	
 22	public static final int STATUS_INITIATED = 0;
 23	public static final int STATUS_ACCEPTED = 1;
 24	public static final int STATUS_FAILED = 99;
 25	
 26	private int status = -1;
 27	private Message message;
 28	private String sessionId;
 29	private Account account;
 30	private String initiator;
 31	private String responder;
 32	private List<Element> canditates = new ArrayList<Element>();
 33	
 34	private OnIqPacketReceived responseListener = new OnIqPacketReceived() {
 35		
 36		@Override
 37		public void onIqPacketReceived(Account account, IqPacket packet) {
 38			if (packet.getType() == IqPacket.TYPE_ERROR) {
 39				status = STATUS_FAILED;
 40			}
 41		}
 42	};
 43	
 44	public JingleConnection(JingleConnectionManager mJingleConnectionManager) {
 45		this.mJingleConnectionManager = mJingleConnectionManager;
 46		this.mXmppConnectionService = mJingleConnectionManager.getXmppConnectionService();
 47		this.sessionId = this.mJingleConnectionManager.nextRandomId();
 48	}
 49	
 50	public String getSessionId() {
 51		return this.sessionId;
 52	}
 53	
 54	public String getAccountJid() {
 55		return this.account.getJid();
 56	}
 57	
 58	public String getCounterPart() {
 59		return this.message.getCounterpart();
 60	}
 61	
 62	public void deliverPacket(JinglePacket packet) {
 63		Log.d("xmppService","packet arrived in connection");
 64		if (packet.isAction("")) {
 65			
 66		}
 67	}
 68	
 69	public void init(Message message) {
 70		this.message = message;
 71		this.account = message.getConversation().getAccount();
 72		this.initiator = this.account.getFullJid();
 73		if (this.canditates.size() > 0) {
 74			this.sendInitRequest();
 75		} else {
 76			this.mJingleConnectionManager.getPrimaryCanditate(account, new OnPrimaryCanditateFound() {
 77				
 78				@Override
 79				public void onPrimaryCanditateFound(boolean success, Element canditate) {
 80					if (success) {
 81						canditates.add(canditate);
 82					}
 83					sendInitRequest();
 84				}
 85			});
 86		}
 87		
 88	}
 89	
 90	private void sendInitRequest() {
 91		JinglePacket packet = this.bootstrapPacket();
 92		packet.setAction("session-initiate");
 93		packet.setInitiator(this.account.getFullJid());
 94		Content content = new Content();
 95		if (message.getType() == Message.TYPE_IMAGE) {
 96			content.setAttribute("creator", "initiator");
 97			content.setAttribute("name", "a-file-offer");
 98			content.offerFile(this.mXmppConnectionService.getFileBackend().getImageFile(message));
 99			content.setCanditates(this.canditates);
100			packet.setContent(content);
101			Log.d("xmppService",packet.toString());
102			account.getXmppConnection().sendIqPacket(packet, this.responseListener);
103			this.status = STATUS_INITIATED;
104		}
105	}
106	
107	private JinglePacket bootstrapPacket() {
108		JinglePacket packet = new JinglePacket();
109		packet.setFrom(account.getFullJid());
110		packet.setTo(this.message.getCounterpart()); //fixme, not right in all cases;
111		packet.setSessionId(this.sessionId);
112		return packet;
113	}
114
115}