2014-10-22 16:38:44 +00:00
|
|
|
package eu.siacs.conversations.xmpp.jingle;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
import eu.siacs.conversations.xml.Element;
|
2018-04-28 14:26:40 +00:00
|
|
|
import eu.siacs.conversations.xmpp.InvalidJid;
|
2018-03-05 17:30:40 +00:00
|
|
|
import rocks.xmpp.addr.Jid;
|
2014-10-22 16:38:44 +00:00
|
|
|
|
|
|
|
public class JingleCandidate {
|
|
|
|
|
|
|
|
public static int TYPE_UNKNOWN;
|
|
|
|
public static int TYPE_DIRECT = 0;
|
|
|
|
public static int TYPE_PROXY = 1;
|
|
|
|
|
|
|
|
private boolean ours;
|
|
|
|
private boolean usedByCounterpart = false;
|
|
|
|
private String cid;
|
|
|
|
private String host;
|
|
|
|
private int port;
|
|
|
|
private int type;
|
2014-11-06 19:10:03 +00:00
|
|
|
private Jid jid;
|
2014-10-22 16:38:44 +00:00
|
|
|
private int priority;
|
|
|
|
|
|
|
|
public JingleCandidate(String cid, boolean ours) {
|
|
|
|
this.ours = ours;
|
|
|
|
this.cid = cid;
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getCid() {
|
|
|
|
return cid;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setHost(String host) {
|
|
|
|
this.host = host;
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getHost() {
|
|
|
|
return this.host;
|
|
|
|
}
|
|
|
|
|
2014-11-06 19:10:03 +00:00
|
|
|
public void setJid(final Jid jid) {
|
2014-10-22 16:38:44 +00:00
|
|
|
this.jid = jid;
|
|
|
|
}
|
|
|
|
|
2014-11-06 19:10:03 +00:00
|
|
|
public Jid getJid() {
|
2014-10-22 16:38:44 +00:00
|
|
|
return this.jid;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setPort(int port) {
|
|
|
|
this.port = port;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getPort() {
|
|
|
|
return this.port;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setType(int type) {
|
|
|
|
this.type = type;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setType(String type) {
|
2019-05-22 15:30:51 +00:00
|
|
|
if (type == null) {
|
|
|
|
this.type = TYPE_UNKNOWN;
|
|
|
|
return;
|
|
|
|
}
|
2014-11-06 19:10:03 +00:00
|
|
|
switch (type) {
|
|
|
|
case "proxy":
|
|
|
|
this.type = TYPE_PROXY;
|
|
|
|
break;
|
|
|
|
case "direct":
|
|
|
|
this.type = TYPE_DIRECT;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
this.type = TYPE_UNKNOWN;
|
|
|
|
break;
|
|
|
|
}
|
2014-10-22 16:38:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public void setPriority(int i) {
|
|
|
|
this.priority = i;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getPriority() {
|
|
|
|
return this.priority;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean equals(JingleCandidate other) {
|
|
|
|
return this.getCid().equals(other.getCid());
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean equalValues(JingleCandidate other) {
|
2015-01-09 13:42:58 +00:00
|
|
|
return other != null && other.getHost().equals(this.getHost()) && (other.getPort() == this.getPort());
|
2014-10-22 16:38:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isOurs() {
|
|
|
|
return ours;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getType() {
|
|
|
|
return this.type;
|
|
|
|
}
|
|
|
|
|
2020-04-02 08:59:25 +00:00
|
|
|
public static List<JingleCandidate> parse(final List<Element> elements) {
|
|
|
|
final List<JingleCandidate> candidates = new ArrayList<>();
|
|
|
|
for (final Element element : elements) {
|
|
|
|
if ("candidate".equals(element.getName())) {
|
|
|
|
candidates.add(JingleCandidate.parse(element));
|
|
|
|
}
|
2014-10-22 16:38:44 +00:00
|
|
|
}
|
2020-04-02 08:59:25 +00:00
|
|
|
return candidates;
|
2014-10-22 16:38:44 +00:00
|
|
|
}
|
|
|
|
|
2020-04-02 08:59:25 +00:00
|
|
|
public static JingleCandidate parse(Element element) {
|
|
|
|
final JingleCandidate candidate = new JingleCandidate(element.getAttribute("cid"), false);
|
|
|
|
candidate.setHost(element.getAttribute("host"));
|
|
|
|
candidate.setJid(InvalidJid.getNullForInvalid(element.getAttributeAsJid("jid")));
|
|
|
|
candidate.setType(element.getAttribute("type"));
|
|
|
|
candidate.setPriority(Integer.parseInt(element.getAttribute("priority")));
|
|
|
|
candidate.setPort(Integer.parseInt(element.getAttribute("port")));
|
|
|
|
return candidate;
|
2014-10-22 16:38:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public Element toElement() {
|
|
|
|
Element element = new Element("candidate");
|
|
|
|
element.setAttribute("cid", this.getCid());
|
|
|
|
element.setAttribute("host", this.getHost());
|
|
|
|
element.setAttribute("port", Integer.toString(this.getPort()));
|
2019-09-01 13:06:59 +00:00
|
|
|
if (jid != null) {
|
|
|
|
element.setAttribute("jid", jid.toEscapedString());
|
|
|
|
}
|
2014-10-22 16:38:44 +00:00
|
|
|
element.setAttribute("priority", Integer.toString(this.getPriority()));
|
|
|
|
if (this.getType() == TYPE_DIRECT) {
|
|
|
|
element.setAttribute("type", "direct");
|
|
|
|
} else if (this.getType() == TYPE_PROXY) {
|
|
|
|
element.setAttribute("type", "proxy");
|
|
|
|
}
|
|
|
|
return element;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void flagAsUsedByCounterpart() {
|
|
|
|
this.usedByCounterpart = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isUsedByCounterpart() {
|
|
|
|
return this.usedByCounterpart;
|
|
|
|
}
|
|
|
|
|
|
|
|
public String toString() {
|
|
|
|
return this.getHost() + ":" + this.getPort() + " (prio="
|
|
|
|
+ this.getPriority() + ")";
|
|
|
|
}
|
|
|
|
}
|