Add functionality to create TransportElements

This commit is contained in:
vanitasvitae 2017-06-08 17:32:37 +02:00
parent 6c0162c341
commit db294f3f1b
Signed by: vanitasvitae
GPG Key ID: 62BEE9264BF17311
8 changed files with 65 additions and 8 deletions

View File

@ -27,24 +27,25 @@ import java.util.logging.Logger;
import org.jivesoftware.smack.Manager;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.smackx.disco.ServiceDiscoveryManager;
import org.jivesoftware.smackx.hash.HashManager;
import org.jivesoftware.smackx.hash.element.HashElement;
import org.jivesoftware.smackx.jingle.AbstractJingleContentTransportManager;
import org.jivesoftware.smackx.jingle.JingleContentProviderManager;
import org.jivesoftware.smackx.jingle.JingleHandler;
import org.jivesoftware.smackx.jingle.JingleManager;
import org.jivesoftware.smackx.jingle.element.Jingle;
import org.jivesoftware.smackx.jingle.element.JingleContent;
import org.jivesoftware.smackx.jingle.element.JingleContentDescriptionChildElement;
import org.jivesoftware.smackx.jingle.JingleContentProviderManager;
import org.jivesoftware.smackx.jingle_filetransfer.callback.IncomingJingleFileTransferCallback;
import org.jivesoftware.smackx.jingle_filetransfer.element.JingleFileTransferChildElement;
import org.jivesoftware.smackx.jingle_filetransfer.element.JingleFileTransferContentDescription;
import org.jivesoftware.smackx.jingle_filetransfer.listener.IncomingJingleFileTransferListener;
import org.jivesoftware.smackx.jingle_filetransfer.provider.JingleFileTransferContentDescriptionProvider;
import org.jivesoftware.smackx.jingle_ibb.JingleInBandBytestreamTransportManager;
import org.jivesoftware.smackx.jingle_ibb.element.JingleInBandBytestreamTransport;
import org.jxmpp.jid.FullJid;
/**
@ -112,7 +113,9 @@ public final class JingleFileTransferManager extends Manager implements JingleHa
* QnD method.
* @param file
*/
public void sendFile(File file, final FullJid recipient) throws IOException, SmackException.NotConnectedException, InterruptedException {
public void sendFile(File file, final FullJid recipient) throws IOException, SmackException.NotConnectedException, InterruptedException, XMPPException.XMPPErrorException, SmackException.NoResponseException {
AbstractJingleContentTransportManager<?> preferedTransportManager = JingleInBandBytestreamTransportManager.getInstanceFor(connection());
JingleFileTransferSession session = new JingleFileTransferSession(connection(), recipient, connection().getUser(), recipient);
JingleFileTransferChildElement.Builder b = JingleFileTransferChildElement.getBuilder();
b.setFile(file);
@ -132,7 +135,7 @@ public final class JingleFileTransferManager extends Manager implements JingleHa
bb.setDescription(new JingleFileTransferContentDescription(payloads))
.setCreator(JingleContent.Creator.initiator)
.setName(StringUtils.randomString(24))
.addTransport(new JingleInBandBytestreamTransport());
.addTransport(preferedTransportManager.createJingleContentTransport());
Jingle jingle = (Jingle) session.initiate(Collections.singletonList(bb.build()));
jingle.setTo(recipient);

View File

@ -38,6 +38,7 @@ import org.jivesoftware.smackx.jingle.element.JingleContentTransport;
import org.jivesoftware.smackx.jingle.provider.JingleContentTransportProvider;
import org.jivesoftware.smackx.jingle_ibb.element.JingleInBandBytestreamTransport;
import org.jivesoftware.smackx.jingle_ibb.provider.JingleInBandByteStreamTransportProvider;
import org.jxmpp.jid.Jid;
/**
* Manager for Jingle In-Band-Bytestreams.
@ -122,4 +123,9 @@ public final class JingleInBandBytestreamTransportManager extends AbstractJingle
return ibs.getOutputStream();
}
@Override
public JingleInBandBytestreamTransport createJingleContentTransport(Jid otherUser) throws XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException, SmackException.NoResponseException {
return new JingleInBandBytestreamTransport();
}
}

View File

@ -38,7 +38,7 @@ public class JingleInBandBytestreamTransport extends JingleContentTransport {
}
public JingleInBandBytestreamTransport(short blockSize) {
this(blockSize, JingleTransportManager.generateSessionId());
this(blockSize, JingleTransportManager.generateRandomId());
}
public JingleInBandBytestreamTransport(short blockSize, String sid) {

View File

@ -17,18 +17,23 @@
package org.jivesoftware.smackx.jingle_s5b;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.smackx.bytestreams.socks5.Socks5BytestreamManager;
import org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream;
import org.jivesoftware.smackx.hash.HashManager;
import org.jivesoftware.smackx.jingle.AbstractJingleContentTransportManager;
import org.jivesoftware.smackx.jingle.JingleTransportInputStreamCallback;
import org.jivesoftware.smackx.jingle.JingleTransportManager;
import org.jivesoftware.smackx.jingle.element.Jingle;
import org.jivesoftware.smackx.jingle.provider.JingleContentTransportProvider;
import org.jivesoftware.smackx.jingle_s5b.elements.JingleSocks5BytestreamTransport;
import org.jivesoftware.smackx.jingle_s5b.elements.JingleSocks5BytestreamTransportCandidate;
import org.jivesoftware.smackx.jingle_s5b.provider.JingleSocks5BytestreamTransportProvider;
import org.jxmpp.jid.Jid;
@ -71,4 +76,38 @@ public final class JingleSocks5BytestreamTransportManager extends AbstractJingle
public OutputStream createOutputStream(Jingle jingle) {
return null;
}
@Override
public JingleSocks5BytestreamTransport createJingleContentTransport(Jid otherUser) throws XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException, SmackException.NoResponseException {
JingleSocks5BytestreamTransport.Builder builder = JingleSocks5BytestreamTransport.getBuilder();
List<Bytestream.StreamHost> localStreams = getLocalStreamHosts();
List<Bytestream.StreamHost> availableStreams = getAvailableStreamHosts();
for (Bytestream.StreamHost host : localStreams) {
JingleSocks5BytestreamTransportCandidate candidate = new JingleSocks5BytestreamTransportCandidate(host, 100);
builder.addTransportCandidate(candidate);
}
for (Bytestream.StreamHost host : availableStreams) {
JingleSocks5BytestreamTransportCandidate candidate = new JingleSocks5BytestreamTransportCandidate(host, 0);
builder.addTransportCandidate(candidate);
}
builder.setMode(Bytestream.Mode.tcp);
String sid = JingleTransportManager.generateRandomId();
builder.setStreamId(sid);
String digestString =
sid +
connection().getUser().asFullJidIfPossible().toString() +
otherUser.asFullJidIfPossible().toString();
try {
builder.setDestinationAddress(
new String(HashManager.sha_1(digestString.getBytes(StringUtils.UTF8)), StringUtils.UTF8));
} catch (UnsupportedEncodingException e) {
throw new AssertionError(e);
}
return builder.build();
}
}

View File

@ -58,7 +58,7 @@ public final class JingleSocks5BytestreamTransportCandidate extends JingleConten
}
public JingleSocks5BytestreamTransportCandidate(Bytestream.StreamHost streamHost, int priority) {
this.cid = JingleTransportManager.generateSessionId();
this.cid = JingleTransportManager.generateRandomId();
this.host = streamHost.getAddress();
this.jid = streamHost.getJID();
this.port = streamHost.getPort();
@ -117,6 +117,10 @@ public final class JingleSocks5BytestreamTransportCandidate extends JingleConten
return type;
}
public Bytestream.StreamHost getStreamHost() {
return new Bytestream.StreamHost(jid, host, port);
}
@Override
public CharSequence toXML() {
XmlStringBuilder xml = new XmlStringBuilder();

View File

@ -35,7 +35,7 @@ public class JingleInBandByteStreamTransportTest extends SmackTestSuite {
@Test
public void parserTest() throws Exception {
String sid = JingleTransportManager.generateSessionId();
String sid = JingleTransportManager.generateRandomId();
short size = 8192;
String xml = "<transport xmlns='urn:xmpp:jingle:transports:ibb:1' block-size='8192' sid='" + sid + "'/>";

View File

@ -19,11 +19,14 @@ package org.jivesoftware.smackx.jingle;
import java.io.OutputStream;
import org.jivesoftware.smack.Manager;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smackx.disco.ServiceDiscoveryManager;
import org.jivesoftware.smackx.jingle.element.Jingle;
import org.jivesoftware.smackx.jingle.element.JingleContentTransport;
import org.jivesoftware.smackx.jingle.provider.JingleContentTransportProvider;
import org.jxmpp.jid.Jid;
/**
* Interface with methods that JingleContentTransportManagers must implement.
@ -44,4 +47,6 @@ public abstract class AbstractJingleContentTransportManager<D extends JingleCont
public abstract void acceptInputStream(Jingle jingle, JingleTransportInputStreamCallback callback);
public abstract OutputStream createOutputStream(Jingle jingle);
public abstract D createJingleContentTransport(Jid remote) throws XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException, SmackException.NoResponseException;
}

View File

@ -62,7 +62,7 @@ public final class JingleTransportManager extends Manager {
contentTransportManagers.remove(manager.getNamespace());
}
public static String generateSessionId() {
public static String generateRandomId() {
return StringUtils.randomString(24);
}
}