mirror of
https://github.com/vanitasvitae/Smack.git
synced 2024-11-23 20:42:06 +01:00
Add functionality to create TransportElements
This commit is contained in:
parent
6c0162c341
commit
db294f3f1b
8 changed files with 65 additions and 8 deletions
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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 + "'/>";
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue