diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/component/JingleFileTransfer.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/component/JingleFileTransfer.java index 9dc4c0e77..ae472f5b8 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/component/JingleFileTransfer.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/component/JingleFileTransfer.java @@ -20,7 +20,12 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import org.jivesoftware.smack.SmackException; +import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smackx.jingle.component.JingleDescription; +import org.jivesoftware.smackx.jingle.component.JingleSession; +import org.jivesoftware.smackx.jingle.element.JingleElement; +import org.jivesoftware.smackx.jingle.element.JingleReasonElement; import org.jivesoftware.smackx.jingle_filetransfer.controller.JingleFileTransferController; import org.jivesoftware.smackx.jingle_filetransfer.element.JingleFileTransferElement; import org.jivesoftware.smackx.jingle_filetransfer.listener.ProgressListener; @@ -33,9 +38,6 @@ public abstract class JingleFileTransfer extends JingleDescription blacklist, XMPPConnection connection) throws SmackException.NotConnectedException, InterruptedException, XMPPException.XMPPErrorException, SmackException.NoResponseException { diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/component/JingleSession.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/component/JingleSession.java index 000953c59..bd7d1a565 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/component/JingleSession.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/component/JingleSession.java @@ -145,6 +145,58 @@ public class JingleSession { return JingleElement.createSessionAccept(getInitiator(), getResponder(), getSessionId(), contentElements); } + void onContentFinished(JingleContent jingleContent) { + if (contents.get(jingleContent.getName()) == null) { + LOGGER.log(Level.WARNING, "Session does not contain content " + jingleContent.getName() + ". Ignore contentFinished."); + return; + } + + if (contents.size() == 1) { + //Only content has finished. End session. + terminateSession(JingleReasonElement.Reason.success); + return; + } + + // Session has still active contents left. + /* + try { + jingleManager.getConnection().createStanzaCollectorAndSend(JingleElement.createSessionTerminateContentCancel( + getPeer(), getSessionId(), jingleContent.getCreator(), jingleContent.getName())); + } catch (SmackException.NotConnectedException | InterruptedException e) { + LOGGER.log(Level.SEVERE, "Could not send content-cancel: " + e, e); + } + contents.remove(jingleContent.getName()); + */ + } + + void onContentCancel(JingleContent jingleContent) { + if (contents.get(jingleContent.getName()) == null) { + LOGGER.log(Level.WARNING, "Session does not contain content " + jingleContent.getName() + ". Ignore onContentCancel."); + return; + } + + if (contents.size() == 1) { + terminateSession(JingleReasonElement.Reason.cancel); + jingleManager.removeSession(this); + } else { + try { + jingleManager.getConnection().createStanzaCollectorAndSend(JingleElement.createSessionTerminateContentCancel(getPeer(), getSessionId(), jingleContent.getCreator(), jingleContent.getName())); + } catch (SmackException.NotConnectedException | InterruptedException e) { + LOGGER.log(Level.SEVERE, "Could not send content-cancel: " + e, e); + } + contents.remove(jingleContent.getName()); + } + } + + public void terminateSession(JingleReasonElement.Reason reason) { + try { + jingleManager.getConnection().createStanzaCollectorAndSend(JingleElement.createSessionTerminate(getPeer(), getSessionId(), reason)); + } catch (SmackException.NotConnectedException | InterruptedException e) { + LOGGER.log(Level.SEVERE, "Could not send session-terminate: " + e, e); + } + jingleManager.removeSession(this); + } + public IQ handleJingleRequest(JingleElement request) { switch (request.getAction()) { case content_modify: @@ -198,17 +250,27 @@ public class JingleSession { } private IQ handleSessionInitiate(JingleElement request) { - JingleDescription description = getSoleContentOrThrow().getDescription(); + final JingleDescription description = getSoleContentOrThrow().getDescription(); final JingleDescriptionManager descriptionManager = jingleManager.getDescriptionManager(description.getNamespace()); if (descriptionManager == null) { - LOGGER.log(Level.WARNING, "Unsupported description type: " + description.getNamespace()); - return JingleElement.createSessionTerminate(getPeer(), getSessionId(), JingleReasonElement.Reason.unsupported_applications); + } Async.go(new Runnable() { @Override public void run() { - descriptionManager.notifySessionInitiate(JingleSession.this); + if (descriptionManager == null) { + + LOGGER.log(Level.WARNING, "Unsupported description type: " + description.getNamespace()); + try { + jingleManager.getConnection().createStanzaCollectorAndSend(JingleElement.createSessionTerminate(getPeer(), getSessionId(), JingleReasonElement.Reason.unsupported_applications)); + } catch (SmackException.NotConnectedException | InterruptedException e) { + LOGGER.log(Level.SEVERE, "Could not send session-terminate: " + e, e); + } + + } else { + descriptionManager.notifySessionInitiate(JingleSession.this); + } } });