diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/JingleFileTransferSession.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/JingleFileTransferSession.java index 73def6d17..9645a7e44 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/JingleFileTransferSession.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/JingleFileTransferSession.java @@ -63,6 +63,7 @@ public class JingleFileTransferSession extends AbstractJingleSession { private JingleContent receivedContent; private final FullJid remote; private final String sessionId; + private final JingleContent.Creator role; /** * Send a file. @@ -74,6 +75,7 @@ public class JingleFileTransferSession extends AbstractJingleSession { this.remote = recipient; this.source = send; this.sessionId = StringUtils.randomString(24); + this.role = JingleContent.Creator.initiator; JingleFileTransferChild fileTransferChild = fileElementFromFile(send); JingleContent.Builder cb = JingleContent.getBuilder(); @@ -106,7 +108,7 @@ public class JingleFileTransferSession extends AbstractJingleSession { */ public JingleFileTransferSession(XMPPConnection connection, Jingle initiate) { super(connection); - LOGGER.log(Level.INFO, "Incoming session!"); + this.role = JingleContent.Creator.responder; this.sessionId = initiate.getSessionId(); this.remote = initiate.getInitiator(); this.source = null; @@ -142,6 +144,25 @@ public class JingleFileTransferSession extends AbstractJingleSession { return IQ.createResultIQ(jingle); } + @Override + public JingleManager.FullJidAndSessionId getFullJidAndSessionId() { + return parent.getFullJidAndSessionId(); + } + + @Override + public JingleContent getReceivedContent() { + return parent.getReceivedContent(); + } + + @Override + public JingleContent getProposedContent() { + return parent.getProposedContent(); + } + + @Override + public JingleContent.Creator getRole() { + return parent.getRole(); + } } private static class OutgoingAccepted extends AbstractJingleSession { @@ -160,10 +181,28 @@ public class JingleFileTransferSession extends AbstractJingleSession { } JingleTransportHandler transportHandler = tm.createJingleTransportHandler(this); - transportHandler.prepareOutgoingSession(parent.getFullJidAndSessionId(), parent.proposedContent); parent.addTransportInfoListener(transportHandler); - transportHandler.establishOutgoingSession(parent.getFullJidAndSessionId(), parent.receivedContent, - parent.proposedContent, parent.outgoingFileTransferSessionEstablishedCallback); + transportHandler.establishOutgoingSession(parent.outgoingFileTransferSessionEstablishedCallback); + } + + @Override + public JingleManager.FullJidAndSessionId getFullJidAndSessionId() { + return parent.getFullJidAndSessionId(); + } + + @Override + public JingleContent getReceivedContent() { + return parent.getReceivedContent(); + } + + @Override + public JingleContent getProposedContent() { + return parent.getProposedContent(); + } + + @Override + public JingleContent.Creator getRole() { + return parent.getRole(); } } @@ -215,12 +254,34 @@ public class JingleFileTransferSession extends AbstractJingleSession { JingleFileTransferManager.getInstanceFor(connection).notifyIncomingJingleFileTransferListeners(file, callback); return IQ.createResultIQ(initiate); } + + @Override + public JingleManager.FullJidAndSessionId getFullJidAndSessionId() { + return parent.getFullJidAndSessionId(); + } + + @Override + public JingleContent getReceivedContent() { + return parent.getReceivedContent(); + } + + @Override + public JingleContent getProposedContent() { + return parent.getProposedContent(); + } + + @Override + public JingleContent.Creator getRole() { + return parent.getRole(); + } } private static class IncomingAccepted extends AbstractJingleSession { + private final JingleFileTransferSession parent; public IncomingAccepted(XMPPConnection connection, JingleFileTransferSession parent) { super(connection); + this.parent = parent; AbstractJingleTransportManager tm = null; try { tm = JingleTransportManager.getJingleContentTransportManager( @@ -231,8 +292,27 @@ public class JingleFileTransferSession extends AbstractJingleSession { JingleTransportHandler transportHandler = tm.createJingleTransportHandler(this); parent.addTransportInfoListener(transportHandler); - transportHandler.establishIncomingSession(parent.getFullJidAndSessionId(), parent.receivedContent, - parent.proposedContent, parent.incomingFileTransferSessionEstablishedCallback); + transportHandler.establishIncomingSession(parent.incomingFileTransferSessionEstablishedCallback); + } + + @Override + public JingleManager.FullJidAndSessionId getFullJidAndSessionId() { + return parent.getFullJidAndSessionId(); + } + + @Override + public JingleContent getReceivedContent() { + return parent.getReceivedContent(); + } + + @Override + public JingleContent getProposedContent() { + return parent.getProposedContent(); + } + + @Override + public JingleContent.Creator getRole() { + return parent.getRole(); } } @@ -440,10 +520,36 @@ public class JingleFileTransferSession extends AbstractJingleSession { } } + @Override public JingleManager.FullJidAndSessionId getFullJidAndSessionId() { return new JingleManager.FullJidAndSessionId(remote, sessionId); } + @Override + public JingleContent getProposedContent() { + return proposedContent; + } + + public void setProposedContent(JingleContent proposedContent) { + this.proposedContent = proposedContent; + } + + @Override + public JingleContent getReceivedContent() { + return receivedContent; + } + + public void setReceivedContent(JingleContent receivedContent) { + this.receivedContent = receivedContent; + } + + @Override + public JingleContent.Creator getRole() { + return role; + } + + + @Override protected IQ handleSessionInitiate(Jingle sessionInitiate) { return state.handleSessionInitiate(sessionInitiate); diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_ibb/JingleIBBTransportHandler.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_ibb/JingleIBBTransportHandler.java index f88049b54..7c218c5df 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_ibb/JingleIBBTransportHandler.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_ibb/JingleIBBTransportHandler.java @@ -16,8 +16,6 @@ */ package org.jivesoftware.smackx.jingle_ibb; -import java.lang.ref.WeakReference; - import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.XMPPException; @@ -26,12 +24,10 @@ import org.jivesoftware.smackx.bytestreams.BytestreamRequest; import org.jivesoftware.smackx.bytestreams.BytestreamSession; import org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamManager; import org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamSession; -import org.jivesoftware.smackx.jingle.JingleManager; import org.jivesoftware.smackx.jingle.JingleSessionHandler; import org.jivesoftware.smackx.jingle.JingleTransportEstablishedCallback; import org.jivesoftware.smackx.jingle.JingleTransportHandler; import org.jivesoftware.smackx.jingle.element.Jingle; -import org.jivesoftware.smackx.jingle.element.JingleContent; import org.jivesoftware.smackx.jingle.exception.JingleTransportFailureException; import org.jivesoftware.smackx.jingle_ibb.element.JingleIBBTransport; @@ -40,27 +36,20 @@ import org.jivesoftware.smackx.jingle_ibb.element.JingleIBBTransport; */ public class JingleIBBTransportHandler implements JingleTransportHandler { - private final WeakReference jingleSessionHandler; + private final JingleSessionHandler jingleSessionHandler; public JingleIBBTransportHandler(JingleSessionHandler sessionHandler) { - this.jingleSessionHandler = new WeakReference<>(sessionHandler); + this.jingleSessionHandler = sessionHandler; } @Override - public void prepareOutgoingSession(JingleManager.FullJidAndSessionId fullJidAndSessionId, JingleContent content) { - // Nothing to do - } - - @Override - public void establishOutgoingSession(JingleManager.FullJidAndSessionId fullJidAndSessionId, - JingleContent receivedContent, - JingleContent proposedContent, - JingleTransportEstablishedCallback callback) { + public void establishOutgoingSession(JingleTransportEstablishedCallback callback) { InBandBytestreamSession session; + try { session = InBandBytestreamManager.getByteStreamManager(getConnection()) - .establishSession(fullJidAndSessionId.getFullJid(), fullJidAndSessionId.getSessionId()); + .establishSession(jingleSessionHandler.getFullJidAndSessionId().getFullJid(), jingleSessionHandler.getFullJidAndSessionId().getSessionId()); } catch (SmackException.NoResponseException | XMPPException.XMPPErrorException | SmackException.NotConnectedException | InterruptedException e) { callback.onSessionFailure(new JingleTransportFailureException(e)); return; @@ -70,15 +59,12 @@ public class JingleIBBTransportHandler implements JingleTransportHandler { + private static final Logger LOGGER = Logger.getLogger(JingleS5BTransportHandler.class.getName()); - private final WeakReference sessionHandler; - - private JingleManager.FullJidAndSessionId fullJidAndSessionId; - private JingleContent receivedContent; - private JingleContent proposedContent; + private JingleS5BTransportHandlerInterface state; + private final JingleSessionHandler sessionHandler; private JingleTransportEstablishedCallback callback; - private JingleS5BTransport myTransport; - private JingleS5BTransportCandidate receivedCandidateUsed = null; - private JingleS5BTransportCandidate selectedCandidateUsed = null; + private boolean localCandidateError = false; + private boolean remoteCandidateError = false; + private Socket connectedSocket; - private Socket connectedSocket = null; + private JingleS5BTransportCandidate usedCandidate; public JingleS5BTransportHandler(JingleSessionHandler sessionHandler) { - this.sessionHandler = new WeakReference<>(sessionHandler); + this.sessionHandler = sessionHandler; } @Override - public void prepareOutgoingSession(JingleManager.FullJidAndSessionId fullJidAndSessionId, JingleContent content) { - myTransport = (JingleS5BTransport) content.getJingleTransports().get(0); - Socks5Proxy.getSocks5Proxy().addLocalAddress(myTransport.getDestinationAddress()); - } - - @Override - public void establishOutgoingSession(JingleManager.FullJidAndSessionId fullJidAndSessionId, - JingleContent receivedContent, - JingleContent proposedContent, - JingleTransportEstablishedCallback callback) { - establishSession(fullJidAndSessionId, receivedContent, proposedContent, callback); - } - - @Override - public void establishIncomingSession(JingleManager.FullJidAndSessionId fullJidAndSessionId, - JingleContent receivedContent, - JingleContent proposedContent, - JingleTransportEstablishedCallback callback) { - establishSession(fullJidAndSessionId, receivedContent, proposedContent, callback); - } - - void establishSession(JingleManager.FullJidAndSessionId fullJidAndSessionId, - JingleContent receivedContent, - JingleContent proposedContent, - JingleTransportEstablishedCallback callback) { - this.fullJidAndSessionId = fullJidAndSessionId; - this.receivedContent = receivedContent; - this.proposedContent = proposedContent; - this.callback = callback; - - JingleContentTransport hopefullyS5BTransport = receivedContent.getJingleTransports().get(0); - if (!hopefullyS5BTransport.getNamespace().equals(JingleS5BTransport.NAMESPACE_V1)) { - throw new IllegalArgumentException("Transport must be a JingleS5BTransport."); + public boolean onTransportInfoReceived(Jingle transportInfo) { + boolean handled = state.onTransportInfoReceived(transportInfo); + if (handled) { + return true; } - JingleS5BTransport transport = (JingleS5BTransport) hopefullyS5BTransport; + return false; + } + + @Override + public void establishOutgoingSession(JingleTransportEstablishedCallback callback) { + establishSession(callback); + } + + @Override + public void establishIncomingSession(JingleTransportEstablishedCallback callback) { + establishSession(callback); + } + + void establishSession(JingleTransportEstablishedCallback callback) { + this.callback = callback; + JingleS5BTransport transport = (JingleS5BTransport) sessionHandler.getReceivedContent().getJingleTransports().get(0); Socks5Proxy.getSocks5Proxy().addLocalAddress(Socks5Utils.createDigest( - fullJidAndSessionId.getSessionId(), //SessionID - getConnection().getUser().asFullJidIfPossible(), //Us - fullJidAndSessionId.getFullJid())); //Them + sessionHandler.getFullJidAndSessionId().getSessionId(), //SessionID + getConnection().getUser().asFullJidIfPossible(), //Us + sessionHandler.getFullJidAndSessionId().getFullJid())); //Them + + JingleS5BTransportCandidate connectedCandidate = null; - JingleS5BTransportCandidate usedCandidate = null; for (JingleContentTransportCandidate c : transport.getCandidates()) { - usedCandidate = (JingleS5BTransportCandidate) c; - Bytestream.StreamHost streamHost = usedCandidate.getStreamHost(); + JingleS5BTransportCandidate candidate = (JingleS5BTransportCandidate) c; + Bytestream.StreamHost streamHost = candidate.getStreamHost(); String address = streamHost.getAddress() + ":" + streamHost.getPort(); - LOGGER.log(Level.INFO, "Connect to " + address); // establish socket try { final Socks5Client socks5Client = new Socks5Client(streamHost, transport.getDestinationAddress()); connectedSocket = socks5Client.getSocket(10 * 1000); - selectedCandidateUsed = usedCandidate; + connectedCandidate = candidate; break; } catch (TimeoutException | IOException | SmackException | XMPPException | InterruptedException e) { @@ -129,136 +94,220 @@ public class JingleS5BTransportHandler implements JingleTransportHandler receivedCandidateUsed.getPriority()) { - activateProxy(); - } else if (selectedCandidateUsed.getPriority() < receivedCandidateUsed.getPriority()) { - //createCandidateActive() - } else { //== + @Override + public boolean onTransportInfoReceived(Jingle transportInfo) { + return false; } } } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_s5b/elements/JingleS5BTransport.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_s5b/elements/JingleS5BTransport.java index 070acb58d..9fd2ee6f9 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_s5b/elements/JingleS5BTransport.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_s5b/elements/JingleS5BTransport.java @@ -70,6 +70,20 @@ public class JingleS5BTransport extends JingleContentTransport { xml.attribute(ATTR_SID, streamId); } + public boolean hasCandidate(String candidateId) { + return getCandidate(candidateId) != null; + } + + public JingleS5BTransportCandidate getCandidate(String candidateId) { + for (JingleContentTransportCandidate c : candidates) { + JingleS5BTransportCandidate candidate = (JingleS5BTransportCandidate) c; + if (candidate.getCandidateId().equals(candidateId)) { + return candidate; + } + } + return null; + } + public static Builder getBuilder() { return new Builder(); } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleSessionHandler.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleSessionHandler.java index d05626d4b..ea375e85d 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleSessionHandler.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleSessionHandler.java @@ -19,6 +19,7 @@ package org.jivesoftware.smackx.jingle; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smackx.jingle.element.Jingle; +import org.jivesoftware.smackx.jingle.element.JingleContent; public interface JingleSessionHandler { @@ -30,4 +31,12 @@ public interface JingleSessionHandler { void removeTransportInfoListener(JingleTransportInfoListener listener); + JingleManager.FullJidAndSessionId getFullJidAndSessionId(); + + JingleContent getReceivedContent(); + + JingleContent getProposedContent(); + + JingleContent.Creator getRole(); + } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleTransportHandler.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleTransportHandler.java index a8b3f3818..4a241cba9 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleTransportHandler.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleTransportHandler.java @@ -17,7 +17,6 @@ package org.jivesoftware.smackx.jingle; import org.jivesoftware.smack.XMPPConnection; -import org.jivesoftware.smackx.jingle.element.JingleContent; import org.jivesoftware.smackx.jingle.element.JingleContentTransport; /** @@ -25,18 +24,9 @@ import org.jivesoftware.smackx.jingle.element.JingleContentTransport; */ public interface JingleTransportHandler extends JingleTransportInfoListener { - void prepareOutgoingSession(JingleManager.FullJidAndSessionId fullJidAndSessionId, - JingleContent content); + void establishOutgoingSession(JingleTransportEstablishedCallback callback); - void establishOutgoingSession(JingleManager.FullJidAndSessionId fullJidAndSessionId, - JingleContent receivedContent, - JingleContent proposedContent, - JingleTransportEstablishedCallback callback); - - void establishIncomingSession(JingleManager.FullJidAndSessionId fullJidAndSessionId, - JingleContent receivedContent, - JingleContent proposedContent, - JingleTransportEstablishedCallback callback); + void establishIncomingSession(JingleTransportEstablishedCallback callback); XMPPConnection getConnection(); } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleTransportInfoListener.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleTransportInfoListener.java index e5c63c5ef..3cc059565 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleTransportInfoListener.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleTransportInfoListener.java @@ -23,5 +23,5 @@ import org.jivesoftware.smackx.jingle.element.Jingle; */ public interface JingleTransportInfoListener { - void onTransportInfoReceived(Jingle transportInfo); + boolean onTransportInfoReceived(Jingle transportInfo); }