1
0
Fork 0
mirror of https://codeberg.org/Mercury-IM/Smack synced 2024-09-27 10:19:33 +02:00
Smack/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/jingle_s5b/elements/JingleS5BTransportCandidate.java
Florian Schmaus 4133eb175c Replace XPP3 by XmlPullParser interface wrapping StAX and XPP3
Introducing Smack's own XmlPullParser interface which tries to stay as
compatible as possible to XPP3. The interface is used to either wrap
StAX's XMLStreamReader if Smack is used on Java SE, and XPP3's
XmlPullParser if Smack is used on on Android.

Fixes SMACK-591.

Also introduce JUnit 5 and non-strict javadoc projects.
2019-05-06 22:10:50 +02:00

206 lines
5.7 KiB
Java

/**
*
* Copyright 2017 Paul Schaub
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.smackx.jingle.transports.jingle_s5b.elements;
import java.util.logging.Logger;
import org.jivesoftware.smack.util.Objects;
import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.smack.util.XmlStringBuilder;
import org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream;
import org.jivesoftware.smackx.jingle.element.JingleContentTransportCandidate;
import org.jxmpp.jid.Jid;
import org.jxmpp.jid.impl.JidCreate;
import org.jxmpp.stringprep.XmppStringprepException;
/**
* TransportCandidate for Jingle Socks5Bytestream transports.
*/
public final class JingleS5BTransportCandidate extends JingleContentTransportCandidate {
private static final Logger LOGGER = Logger.getLogger(JingleS5BTransportCandidate.class.getName());
public static final String ATTR_CID = "cid";
public static final String ATTR_HOST = "host";
public static final String ATTR_JID = "jid";
public static final String ATTR_PORT = "port";
public static final String ATTR_PRIORITY = "priority";
public static final String ATTR_TYPE = "type";
private final String cid;
private final String host;
private final Jid jid;
private final int port;
private final int priority;
private final Type type;
public JingleS5BTransportCandidate(String candidateId, String host, Jid jid, int port, int priority, Type type) {
Objects.requireNonNull(candidateId);
Objects.requireNonNull(host);
Objects.requireNonNull(jid);
if (priority < 0) {
throw new IllegalArgumentException("Priority MUST NOT be less than 0.");
}
if (port < 0) {
throw new IllegalArgumentException("Port MUST NOT be less than 0.");
}
this.cid = candidateId;
this.host = host;
this.jid = jid;
this.port = port;
this.priority = priority;
this.type = type;
}
public JingleS5BTransportCandidate(Bytestream.StreamHost streamHost, int priority, Type type) {
this(StringUtils.randomString(24), streamHost.getAddress(), streamHost.getJID(), streamHost.getPort(), priority, type);
}
public enum Type {
assisted (120),
direct (126),
proxy (10),
tunnel (110),
;
private final int weight;
public int getWeight() {
return weight;
}
Type(int weight) {
this.weight = weight;
}
public static Type fromString(String name) {
for (Type t : Type.values()) {
if (t.toString().equals(name)) {
return t;
}
}
throw new IllegalArgumentException("Illegal type: " + name);
}
}
public String getCandidateId() {
return cid;
}
public String getHost() {
return host;
}
public Jid getJid() {
return jid;
}
public int getPort() {
return port;
}
public int getPriority() {
return priority;
}
public Type getType() {
return type;
}
public Bytestream.StreamHost getStreamHost() {
return new Bytestream.StreamHost(jid, host, port);
}
@Override
public CharSequence toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) {
XmlStringBuilder xml = new XmlStringBuilder();
xml.halfOpenElement(this);
xml.attribute(ATTR_CID, cid);
xml.attribute(ATTR_HOST, host);
xml.attribute(ATTR_JID, jid);
if (port >= 0) {
xml.attribute(ATTR_PORT, port);
}
xml.attribute(ATTR_PRIORITY, priority);
xml.optAttribute(ATTR_TYPE, type);
xml.closeEmptyElement();
return xml;
}
public static Builder getBuilder() {
return new Builder();
}
public static final class Builder {
private String cid;
private String host;
private Jid jid;
private int port = -1;
private int priority = -1;
private Type type;
private Builder() {
}
public Builder setCandidateId(String cid) {
this.cid = cid;
return this;
}
public Builder setHost(String host) {
this.host = host;
return this;
}
public Builder setJid(String jid) throws XmppStringprepException {
this.jid = JidCreate.from(jid);
return this;
}
public Builder setPort(int port) {
if (port < 0) {
throw new IllegalArgumentException("Port MUST NOT be less than 0.");
}
this.port = port;
return this;
}
public Builder setPriority(int priority) {
if (priority < 0) {
throw new IllegalArgumentException("Priority MUST NOT be less than 0.");
}
this.priority = priority;
return this;
}
public Builder setType(Type type) {
this.type = type;
return this;
}
public JingleS5BTransportCandidate build() {
return new JingleS5BTransportCandidate(cid, host, jid, port, priority, type);
}
}
}