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 --- .../services/JingleConnectionManager.java | 50 ------------ .../services/XmppConnectionService.java | 5 +- .../siacs/conversations/xmpp/JingleConnection.java | 67 --------------- .../conversations/xmpp/OnJinglePacketReceived.java | 8 -- .../siacs/conversations/xmpp/PacketReceived.java | 2 +- .../siacs/conversations/xmpp/XmppConnection.java | 94 ++++++++++++++-------- .../xmpp/jingle/JingleConnection.java | 92 +++++++++++++++++++++ .../xmpp/jingle/JingleConnectionManager.java | 93 +++++++++++++++++++++ .../xmpp/jingle/OnJinglePacketReceived.java | 9 +++ .../xmpp/jingle/OnPrimaryCanditateFound.java | 7 ++ .../conversations/xmpp/jingle/stanzas/Content.java | 35 ++++++++ .../xmpp/jingle/stanzas/JinglePacket.java | 76 +++++++++++++++++ .../conversations/xmpp/jingle/stanzas/Reason.java | 13 +++ .../conversations/xmpp/stanzas/jingle/Content.java | 35 -------- .../xmpp/stanzas/jingle/JinglePacket.java | 76 ----------------- .../conversations/xmpp/stanzas/jingle/Reason.java | 13 --- 16 files changed, 389 insertions(+), 286 deletions(-) delete mode 100644 src/eu/siacs/conversations/services/JingleConnectionManager.java delete mode 100644 src/eu/siacs/conversations/xmpp/JingleConnection.java delete mode 100644 src/eu/siacs/conversations/xmpp/OnJinglePacketReceived.java create mode 100644 src/eu/siacs/conversations/xmpp/jingle/JingleConnection.java create mode 100644 src/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java create mode 100644 src/eu/siacs/conversations/xmpp/jingle/OnJinglePacketReceived.java create mode 100644 src/eu/siacs/conversations/xmpp/jingle/OnPrimaryCanditateFound.java create mode 100644 src/eu/siacs/conversations/xmpp/jingle/stanzas/Content.java create mode 100644 src/eu/siacs/conversations/xmpp/jingle/stanzas/JinglePacket.java create mode 100644 src/eu/siacs/conversations/xmpp/jingle/stanzas/Reason.java delete mode 100644 src/eu/siacs/conversations/xmpp/stanzas/jingle/Content.java delete mode 100644 src/eu/siacs/conversations/xmpp/stanzas/jingle/JinglePacket.java delete mode 100644 src/eu/siacs/conversations/xmpp/stanzas/jingle/Reason.java diff --git a/src/eu/siacs/conversations/services/JingleConnectionManager.java b/src/eu/siacs/conversations/services/JingleConnectionManager.java deleted file mode 100644 index f2ca927a..00000000 --- a/src/eu/siacs/conversations/services/JingleConnectionManager.java +++ /dev/null @@ -1,50 +0,0 @@ -package eu.siacs.conversations.services; - -import java.util.concurrent.ConcurrentHashMap; - -import eu.siacs.conversations.entities.Account; -import eu.siacs.conversations.entities.Message; -import eu.siacs.conversations.xml.Element; -import eu.siacs.conversations.xmpp.JingleConnection; -import eu.siacs.conversations.xmpp.stanzas.jingle.JinglePacket; - -public class JingleConnectionManager { - - private XmppConnectionService xmppConnectionService; - - private ConcurrentHashMap connections = new ConcurrentHashMap(); - - 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,account, message.getCounterpart()); - 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 Element getPrimaryCanditate(String jid) { - Element canditate = new Element("canditate"); - canditate.setAttribute("cid","122"); - canditate.setAttribute("port","1234"); - canditate.setAttribute("jid", jid); - canditate.setAttribute("type", "assisted"); - return canditate; - } -} diff --git a/src/eu/siacs/conversations/services/XmppConnectionService.java b/src/eu/siacs/conversations/services/XmppConnectionService.java index e601d9b9..f5b19d53 100644 --- a/src/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/eu/siacs/conversations/services/XmppConnectionService.java @@ -41,16 +41,17 @@ import eu.siacs.conversations.utils.UIHelper; import eu.siacs.conversations.xml.Element; import eu.siacs.conversations.xmpp.OnBindListener; import eu.siacs.conversations.xmpp.OnIqPacketReceived; -import eu.siacs.conversations.xmpp.OnJinglePacketReceived; import eu.siacs.conversations.xmpp.OnMessagePacketReceived; import eu.siacs.conversations.xmpp.OnPresencePacketReceived; import eu.siacs.conversations.xmpp.OnStatusChanged; import eu.siacs.conversations.xmpp.OnTLSExceptionReceived; import eu.siacs.conversations.xmpp.XmppConnection; +import eu.siacs.conversations.xmpp.jingle.JingleConnectionManager; +import eu.siacs.conversations.xmpp.jingle.OnJinglePacketReceived; +import eu.siacs.conversations.xmpp.jingle.stanzas.JinglePacket; import eu.siacs.conversations.xmpp.stanzas.IqPacket; import eu.siacs.conversations.xmpp.stanzas.MessagePacket; import eu.siacs.conversations.xmpp.stanzas.PresencePacket; -import eu.siacs.conversations.xmpp.stanzas.jingle.JinglePacket; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.Service; diff --git a/src/eu/siacs/conversations/xmpp/JingleConnection.java b/src/eu/siacs/conversations/xmpp/JingleConnection.java deleted file mode 100644 index 34587a93..00000000 --- a/src/eu/siacs/conversations/xmpp/JingleConnection.java +++ /dev/null @@ -1,67 +0,0 @@ -package eu.siacs.conversations.xmpp; - -import java.math.BigInteger; -import java.security.SecureRandom; -import java.util.ArrayList; -import java.util.List; - -import android.util.Log; - -import eu.siacs.conversations.entities.Account; -import eu.siacs.conversations.entities.Message; -import eu.siacs.conversations.services.JingleConnectionManager; -import eu.siacs.conversations.services.XmppConnectionService; -import eu.siacs.conversations.xml.Element; -import eu.siacs.conversations.xmpp.stanzas.jingle.Content; -import eu.siacs.conversations.xmpp.stanzas.jingle.JinglePacket; - -public class JingleConnection { - - private JingleConnectionManager mJingleConnectionManager; - private XmppConnectionService mXmppConnectionService; - - private String sessionId; - private Account account; - private String counterpart; - private List canditates = new ArrayList(); - - public JingleConnection(JingleConnectionManager mJingleConnectionManager, Account account, String counterpart) { - this.mJingleConnectionManager = mJingleConnectionManager; - this.mXmppConnectionService = mJingleConnectionManager.getXmppConnectionService(); - this.account = account; - this.counterpart = counterpart; - SecureRandom random = new SecureRandom(); - sessionId = new BigInteger(100, random).toString(32); - this.canditates.add(this.mJingleConnectionManager.getPrimaryCanditate(account.getJid())); - } - - public String getSessionId() { - return this.sessionId; - } - - public void init(Message message) { - JinglePacket packet = this.bootstrapPacket(); - packet.setAction("session-initiate"); - packet.setInitiator(this.account.getFullJid()); - Content content = new Content(); - if (message.getType() == Message.TYPE_IMAGE) { - //creator='initiator' name='a-file-offer' - content.setAttribute("creator", "initiator"); - content.setAttribute("name", "a-file-offer"); - content.offerFile(this.mXmppConnectionService.getFileBackend().getImageFile(message)); - content.setCanditates(this.canditates); - packet.setContent(content); - Log.d("xmppService",packet.toString()); - account.getXmppConnection().sendIqPacket(packet, null); - } - } - - private JinglePacket bootstrapPacket() { - JinglePacket packet = new JinglePacket(); - packet.setFrom(account.getFullJid()); - packet.setTo(this.counterpart+"/Gajim"); - packet.setSessionId(this.sessionId); - return packet; - } - -} diff --git a/src/eu/siacs/conversations/xmpp/OnJinglePacketReceived.java b/src/eu/siacs/conversations/xmpp/OnJinglePacketReceived.java deleted file mode 100644 index 6705e309..00000000 --- a/src/eu/siacs/conversations/xmpp/OnJinglePacketReceived.java +++ /dev/null @@ -1,8 +0,0 @@ -package eu.siacs.conversations.xmpp; - -import eu.siacs.conversations.entities.Account; -import eu.siacs.conversations.xmpp.stanzas.jingle.JinglePacket; - -public interface OnJinglePacketReceived extends PacketReceived { - public void onJinglePacketReceived(Account account, JinglePacket packet); -} diff --git a/src/eu/siacs/conversations/xmpp/PacketReceived.java b/src/eu/siacs/conversations/xmpp/PacketReceived.java index d9f42459..d4502d73 100644 --- a/src/eu/siacs/conversations/xmpp/PacketReceived.java +++ b/src/eu/siacs/conversations/xmpp/PacketReceived.java @@ -1,5 +1,5 @@ package eu.siacs.conversations.xmpp; -abstract interface PacketReceived { +public abstract interface PacketReceived { } diff --git a/src/eu/siacs/conversations/xmpp/XmppConnection.java b/src/eu/siacs/conversations/xmpp/XmppConnection.java index 1ca7cd8b..c7bda9ca 100644 --- a/src/eu/siacs/conversations/xmpp/XmppConnection.java +++ b/src/eu/siacs/conversations/xmpp/XmppConnection.java @@ -16,9 +16,13 @@ import java.security.cert.CertPathValidatorException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.Hashtable; +import java.util.Iterator; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocket; @@ -44,11 +48,12 @@ import eu.siacs.conversations.xml.Element; import eu.siacs.conversations.xml.Tag; import eu.siacs.conversations.xml.TagWriter; import eu.siacs.conversations.xml.XmlReader; +import eu.siacs.conversations.xmpp.jingle.OnJinglePacketReceived; +import eu.siacs.conversations.xmpp.jingle.stanzas.JinglePacket; import eu.siacs.conversations.xmpp.stanzas.AbstractStanza; import eu.siacs.conversations.xmpp.stanzas.IqPacket; import eu.siacs.conversations.xmpp.stanzas.MessagePacket; import eu.siacs.conversations.xmpp.stanzas.PresencePacket; -import eu.siacs.conversations.xmpp.stanzas.jingle.JinglePacket; import eu.siacs.conversations.xmpp.stanzas.streammgmt.AckPacket; import eu.siacs.conversations.xmpp.stanzas.streammgmt.EnablePacket; import eu.siacs.conversations.xmpp.stanzas.streammgmt.RequestPacket; @@ -70,8 +75,7 @@ public class XmppConnection implements Runnable { private boolean shouldBind = true; private boolean shouldAuthenticate = true; private Element streamFeatures; - private HashSet discoFeatures = new HashSet(); - private List discoItems = new ArrayList(); + private HashMap> disco = new HashMap>(); private String streamId = null; private int smVersion = 3; @@ -644,8 +648,8 @@ public class XmppConnection implements Runnable { tagWriter.writeStanzaAsync(enable); } sendInitialPresence(); - sendServiceDiscoveryInfo(); - sendServiceDiscoveryItems(); + sendServiceDiscoveryInfo(account.getServer()); + sendServiceDiscoveryItems(account.getServer()); if (bindListener !=null) { bindListener.onBind(account); } @@ -654,42 +658,54 @@ public class XmppConnection implements Runnable { }); } - private void sendServiceDiscoveryInfo() { + private void sendServiceDiscoveryInfo(final String server) { IqPacket iq = new IqPacket(IqPacket.TYPE_GET); - iq.setTo(account.getServer()); + iq.setTo(server); iq.query("http://jabber.org/protocol/disco#info"); this.sendIqPacket(iq, new OnIqPacketReceived() { @Override public void onIqPacketReceived(Account account, IqPacket packet) { - List elements = packet.query().getChildren(); - for (int i = 0; i < elements.size(); ++i) { - if (elements.get(i).getName().equals("feature")) { - discoFeatures.add(elements.get(i).getAttribute( - "var")); - } + List elements = packet.query().getChildren(); + List features = new ArrayList(); + for (int i = 0; i < elements.size(); ++i) { + if (elements.get(i).getName().equals("feature")) { + features.add(elements.get(i).getAttribute( + "var")); } - if (discoFeatures.contains("urn:xmpp:carbons:2")) { - sendEnableCarbons(); + } + Log.d(LOGTAG,"put "+server+" "+features.toString()); + disco.put(server, features); + + if (account.getServer().equals(server)) { + enableAdvancedStreamFeatures(); } } }); } - private void sendServiceDiscoveryItems() { + + private void enableAdvancedStreamFeatures() { + if (hasFeaturesCarbon()) { + sendEnableCarbons(); + } + } + + private void sendServiceDiscoveryItems(final String server) { IqPacket iq = new IqPacket(IqPacket.TYPE_GET); - iq.setTo(account.getServer()); + iq.setTo(server); iq.query("http://jabber.org/protocol/disco#items"); this.sendIqPacket(iq, new OnIqPacketReceived() { @Override public void onIqPacketReceived(Account account, IqPacket packet) { - List elements = packet.query().getChildren(); - for (int i = 0; i < elements.size(); ++i) { - if (elements.get(i).getName().equals("item")) { - discoItems.add(elements.get(i).getAttribute( - "jid")); - } + List elements = packet.query().getChildren(); + for (int i = 0; i < elements.size(); ++i) { + if (elements.get(i).getName().equals("item")) { + String jid = elements.get(i).getAttribute( + "jid"); + sendServiceDiscoveryInfo(jid); } + } } }); } @@ -850,7 +866,26 @@ public class XmppConnection implements Runnable { } public boolean hasFeaturesCarbon() { - return discoFeatures.contains("urn:xmpp:carbons:2"); + return hasDiscoFeature(account.getServer(), "urn:xmpp:carbons:2"); + } + + public boolean hasDiscoFeature(String server, String feature) { + if (!disco.containsKey(server)) { + return false; + } + return disco.get(server).contains(feature); + } + + public String findDiscoItemByFeature(String feature) { + Iterator>> it = this.disco.entrySet().iterator(); + while (it.hasNext()) { + Entry> pairs = it.next(); + if (pairs.getValue().contains(feature)) { + return pairs.getKey(); + } + it.remove(); + } + return null; } public void r() { @@ -866,15 +901,6 @@ public class XmppConnection implements Runnable { } public String getMucServer() { - for(int i = 0; i < discoItems.size(); ++i) { - if (discoItems.get(i).contains("conference.")) { - return discoItems.get(i); - } else if (discoItems.get(i).contains("conf.")) { - return discoItems.get(i); - } else if (discoItems.get(i).contains("muc.")) { - return discoItems.get(i); - } - } - return null; + return findDiscoItemByFeature("http://jabber.org/protocol/muc"); } } diff --git a/src/eu/siacs/conversations/xmpp/jingle/JingleConnection.java b/src/eu/siacs/conversations/xmpp/jingle/JingleConnection.java new file mode 100644 index 00000000..60ba0291 --- /dev/null +++ b/src/eu/siacs/conversations/xmpp/jingle/JingleConnection.java @@ -0,0 +1,92 @@ +package eu.siacs.conversations.xmpp.jingle; + +import java.util.ArrayList; +import java.util.List; + +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.Content; +import eu.siacs.conversations.xmpp.jingle.stanzas.JinglePacket; +import eu.siacs.conversations.xmpp.stanzas.IqPacket; + +public class JingleConnection { + + private JingleConnectionManager mJingleConnectionManager; + private XmppConnectionService mXmppConnectionService; + + private Message message; + private String sessionId; + private Account account; + private String initiator; + private String responder; + private List canditates = new ArrayList(); + + private OnIqPacketReceived responseListener = new OnIqPacketReceived() { + + @Override + public void onIqPacketReceived(Account account, IqPacket packet) { + Log.d("xmppService",packet.toString()); + } + }; + + public JingleConnection(JingleConnectionManager mJingleConnectionManager) { + this.mJingleConnectionManager = mJingleConnectionManager; + this.mXmppConnectionService = mJingleConnectionManager.getXmppConnectionService(); + this.sessionId = this.mJingleConnectionManager.nextRandomId(); + } + + public String getSessionId() { + return this.sessionId; + } + + public void init(Message message) { + this.message = message; + this.account = message.getConversation().getAccount(); + this.initiator = this.account.getFullJid(); + if (this.canditates.size() > 0) { + this.sendInitRequest(); + } else { + this.mJingleConnectionManager.getPrimaryCanditate(account, new OnPrimaryCanditateFound() { + + @Override + public void onPrimaryCanditateFound(boolean success, Element canditate) { + if (success) { + canditates.add(canditate); + } + sendInitRequest(); + } + }); + } + + } + + private void sendInitRequest() { + JinglePacket packet = this.bootstrapPacket(); + packet.setAction("session-initiate"); + packet.setInitiator(this.account.getFullJid()); + Content content = new Content(); + if (message.getType() == Message.TYPE_IMAGE) { + content.setAttribute("creator", "initiator"); + content.setAttribute("name", "a-file-offer"); + content.offerFile(this.mXmppConnectionService.getFileBackend().getImageFile(message)); + content.setCanditates(this.canditates); + packet.setContent(content); + Log.d("xmppService",packet.toString()); + account.getXmppConnection().sendIqPacket(packet, this.responseListener); + } + } + + private JinglePacket bootstrapPacket() { + JinglePacket packet = new JinglePacket(); + packet.setFrom(account.getFullJid()); + packet.setTo(this.message.getCounterpart()+"/Gajim"); //fixme, not right in all cases; + packet.setSessionId(this.sessionId); + return packet; + } + +} 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 00000000..784d90d4 --- /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); + } +} diff --git a/src/eu/siacs/conversations/xmpp/jingle/OnJinglePacketReceived.java b/src/eu/siacs/conversations/xmpp/jingle/OnJinglePacketReceived.java new file mode 100644 index 00000000..2aaf62a1 --- /dev/null +++ b/src/eu/siacs/conversations/xmpp/jingle/OnJinglePacketReceived.java @@ -0,0 +1,9 @@ +package eu.siacs.conversations.xmpp.jingle; + +import eu.siacs.conversations.entities.Account; +import eu.siacs.conversations.xmpp.PacketReceived; +import eu.siacs.conversations.xmpp.jingle.stanzas.JinglePacket; + +public interface OnJinglePacketReceived extends PacketReceived { + public void onJinglePacketReceived(Account account, JinglePacket packet); +} diff --git a/src/eu/siacs/conversations/xmpp/jingle/OnPrimaryCanditateFound.java b/src/eu/siacs/conversations/xmpp/jingle/OnPrimaryCanditateFound.java new file mode 100644 index 00000000..25aab118 --- /dev/null +++ b/src/eu/siacs/conversations/xmpp/jingle/OnPrimaryCanditateFound.java @@ -0,0 +1,7 @@ +package eu.siacs.conversations.xmpp.jingle; + +import eu.siacs.conversations.xml.Element; + +public interface OnPrimaryCanditateFound { + public void onPrimaryCanditateFound(boolean success, Element canditate); +} diff --git a/src/eu/siacs/conversations/xmpp/jingle/stanzas/Content.java b/src/eu/siacs/conversations/xmpp/jingle/stanzas/Content.java new file mode 100644 index 00000000..941e6559 --- /dev/null +++ b/src/eu/siacs/conversations/xmpp/jingle/stanzas/Content.java @@ -0,0 +1,35 @@ +package eu.siacs.conversations.xmpp.jingle.stanzas; + +import java.io.File; +import java.util.List; + +import eu.siacs.conversations.xml.Element; + +public class Content extends Element { + private Content(String name) { + super(name); + } + + public Content() { + super("content"); + } + + public void offerFile(File actualFile) { + Element description = this.addChild("description", "urn:xmpp:jingle:apps:file-transfer:3"); + Element offer = description.addChild("offer"); + Element file = offer.addChild("file"); + file.addChild("size").setContent(""+actualFile.length()); + file.addChild("name").setContent(actualFile.getName()); + } + + public void setCanditates(List canditates) { + Element transport = this.findChild("transport", "urn:xmpp:jingle:transports:s5b:1"); + if (transport==null) { + transport = this.addChild("transport", "urn:xmpp:jingle:transports:s5b:1"); + } + transport.clearChildren(); + for(Element canditate : canditates) { + transport.addChild(canditate); + } + } +} diff --git a/src/eu/siacs/conversations/xmpp/jingle/stanzas/JinglePacket.java b/src/eu/siacs/conversations/xmpp/jingle/stanzas/JinglePacket.java new file mode 100644 index 00000000..9cb2b448 --- /dev/null +++ b/src/eu/siacs/conversations/xmpp/jingle/stanzas/JinglePacket.java @@ -0,0 +1,76 @@ +package eu.siacs.conversations.xmpp.jingle.stanzas; + +import eu.siacs.conversations.xml.Element; +import eu.siacs.conversations.xmpp.stanzas.IqPacket; + +public class JinglePacket extends IqPacket { + Content content = null; + Reason reason = null; + Element jingle = new Element("jingle"); + + @Override + public Element addChild(Element child) { + if ("jingle".equals(child.getName())) { + Element contentElement = child.findChild("content"); + if (contentElement!=null) { + this.content = new Content(); + this.content.setChildren(contentElement.getChildren()); + this.content.setAttributes(contentElement.getAttributes()); + } + Element reasonElement = child.findChild("reason"); + if (reasonElement!=null) { + this.reason = new Reason(); + this.reason.setChildren(reasonElement.getChildren()); + this.reason.setAttributes(reasonElement.getAttributes()); + } + this.jingle.setAttributes(child.getAttributes()); + } + return child; + } + + public JinglePacket setContent(Content content) { + this.content = content; + return this; + } + + public JinglePacket setReason(Reason reason) { + this.reason = reason; + return this; + } + + private void build() { + this.children.clear(); + this.jingle.clearChildren(); + this.jingle.setAttribute("xmlns", "urn:xmpp:jingle:1"); + if (this.content!=null) { + jingle.addChild(this.content); + } + if (this.reason != null) { + jingle.addChild(this.reason); + } + this.children.add(jingle); + this.setAttribute("type", "set"); + } + + public String getSessionId() { + return this.jingle.getAttribute("sid"); + } + + public void setSessionId(String sid) { + this.jingle.setAttribute("sid", sid); + } + + @Override + public String toString() { + this.build(); + return super.toString(); + } + + public void setAction(String action) { + this.jingle.setAttribute("action", action); + } + + public void setInitiator(String initiator) { + this.jingle.setAttribute("initiator", initiator); + } +} diff --git a/src/eu/siacs/conversations/xmpp/jingle/stanzas/Reason.java b/src/eu/siacs/conversations/xmpp/jingle/stanzas/Reason.java new file mode 100644 index 00000000..195e0db7 --- /dev/null +++ b/src/eu/siacs/conversations/xmpp/jingle/stanzas/Reason.java @@ -0,0 +1,13 @@ +package eu.siacs.conversations.xmpp.jingle.stanzas; + +import eu.siacs.conversations.xml.Element; + +public class Reason extends Element { + private Reason(String name) { + super(name); + } + + public Reason() { + super("reason"); + } +} diff --git a/src/eu/siacs/conversations/xmpp/stanzas/jingle/Content.java b/src/eu/siacs/conversations/xmpp/stanzas/jingle/Content.java deleted file mode 100644 index ed51a2a5..00000000 --- a/src/eu/siacs/conversations/xmpp/stanzas/jingle/Content.java +++ /dev/null @@ -1,35 +0,0 @@ -package eu.siacs.conversations.xmpp.stanzas.jingle; - -import java.io.File; -import java.util.List; - -import eu.siacs.conversations.xml.Element; - -public class Content extends Element { - private Content(String name) { - super(name); - } - - public Content() { - super("content"); - } - - public void offerFile(File actualFile) { - Element description = this.addChild("description", "urn:xmpp:jingle:apps:file-transfer:3"); - Element offer = description.addChild("offer"); - Element file = offer.addChild("file"); - file.addChild("size").setContent(""+actualFile.length()); - file.addChild("name").setContent(actualFile.getName()); - } - - public void setCanditates(List canditates) { - Element transport = this.findChild("transport", "urn:xmpp:jingle:transports:s5b:1"); - if (transport==null) { - transport = this.addChild("transport", "urn:xmpp:jingle:transports:s5b:1"); - } - transport.clearChildren(); - for(Element canditate : canditates) { - transport.addChild(canditate); - } - } -} diff --git a/src/eu/siacs/conversations/xmpp/stanzas/jingle/JinglePacket.java b/src/eu/siacs/conversations/xmpp/stanzas/jingle/JinglePacket.java deleted file mode 100644 index 4c444a74..00000000 --- a/src/eu/siacs/conversations/xmpp/stanzas/jingle/JinglePacket.java +++ /dev/null @@ -1,76 +0,0 @@ -package eu.siacs.conversations.xmpp.stanzas.jingle; - -import eu.siacs.conversations.xml.Element; -import eu.siacs.conversations.xmpp.stanzas.IqPacket; - -public class JinglePacket extends IqPacket { - Content content = null; - Reason reason = null; - Element jingle = new Element("jingle"); - - @Override - public Element addChild(Element child) { - if ("jingle".equals(child.getName())) { - Element contentElement = child.findChild("content"); - if (contentElement!=null) { - this.content = new Content(); - this.content.setChildren(contentElement.getChildren()); - this.content.setAttributes(contentElement.getAttributes()); - } - Element reasonElement = child.findChild("reason"); - if (reasonElement!=null) { - this.reason = new Reason(); - this.reason.setChildren(reasonElement.getChildren()); - this.reason.setAttributes(reasonElement.getAttributes()); - } - this.jingle.setAttributes(child.getAttributes()); - } - return child; - } - - public JinglePacket setContent(Content content) { - this.content = content; - return this; - } - - public JinglePacket setReason(Reason reason) { - this.reason = reason; - return this; - } - - private void build() { - this.children.clear(); - this.jingle.clearChildren(); - this.jingle.setAttribute("xmlns", "urn:xmpp:jingle:1"); - if (this.content!=null) { - jingle.addChild(this.content); - } - if (this.reason != null) { - jingle.addChild(this.reason); - } - this.children.add(jingle); - this.setAttribute("type", "set"); - } - - public String getSessionId() { - return this.jingle.getAttribute("sid"); - } - - public void setSessionId(String sid) { - this.jingle.setAttribute("sid", sid); - } - - @Override - public String toString() { - this.build(); - return super.toString(); - } - - public void setAction(String action) { - this.jingle.setAttribute("action", action); - } - - public void setInitiator(String initiator) { - this.jingle.setAttribute("initiator", initiator); - } -} diff --git a/src/eu/siacs/conversations/xmpp/stanzas/jingle/Reason.java b/src/eu/siacs/conversations/xmpp/stanzas/jingle/Reason.java deleted file mode 100644 index 35b81655..00000000 --- a/src/eu/siacs/conversations/xmpp/stanzas/jingle/Reason.java +++ /dev/null @@ -1,13 +0,0 @@ -package eu.siacs.conversations.xmpp.stanzas.jingle; - -import eu.siacs.conversations.xml.Element; - -public class Reason extends Element { - private Reason(String name) { - super(name); - } - - public Reason() { - super("reason"); - } -} -- cgit v1.2.3