diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/OutgoingJingleFileOffer.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/OutgoingJingleFileOffer.java
index 149886d46..c0cec237b 100644
--- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/OutgoingJingleFileOffer.java
+++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/OutgoingJingleFileOffer.java
@@ -59,10 +59,12 @@ public class OutgoingJingleFileOffer extends JingleFileTransferSession {
task.cancel(true);
queued.remove(task);
}
+ break;
default:
- jutil.sendSessionTerminateCancel(getRemote(), getSessionId());
}
+
+ jutil.sendSessionTerminateCancel(getRemote(), getSessionId());
notifyEndedListeners(JingleReason.Reason.cancel);
}
diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleUtil.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleUtil.java
index 845311738..cf5199132 100644
--- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleUtil.java
+++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleUtil.java
@@ -42,6 +42,17 @@ public class JingleUtil {
this.connection = connection;
}
+ /**
+ * XEP-0166 Example 10.
+ * @param recipient
+ * @param sessionId
+ * @param contentCreator
+ * @param contentName
+ * @param contentSenders
+ * @param description
+ * @param transport
+ * @return
+ */
public Jingle createSessionInitiate(FullJid recipient,
String sessionId,
JingleContent.Creator contentCreator,
@@ -69,6 +80,16 @@ public class JingleUtil {
return jingle;
}
+ /**
+ * XEP-0234 Example 1.
+ * @param recipient
+ * @param sessionId
+ * @param contentCreator
+ * @param contentName
+ * @param description
+ * @param transport
+ * @return
+ */
public Jingle createSessionInitiateFileOffer(FullJid recipient,
String sessionId,
JingleContent.Creator contentCreator,
@@ -108,6 +129,17 @@ public class JingleUtil {
return connection.createStanzaCollectorAndSend(jingle).nextResult();
}
+ /**
+ * XEP-0166 Example 17.
+ * @param recipient
+ * @param sessionId
+ * @param contentCreator
+ * @param contentName
+ * @param contentSenders
+ * @param description
+ * @param transport
+ * @return
+ */
public Jingle createSessionAccept(FullJid recipient,
String sessionId,
JingleContent.Creator contentCreator,
@@ -151,6 +183,13 @@ public class JingleUtil {
return connection.createStanzaCollectorAndSend(jingle).nextResult();
}
+ /**
+ * XEP-0166 §6.7.
+ * @param recipient
+ * @param sessionId
+ * @param reason
+ * @return
+ */
public Jingle createSessionTerminate(FullJid recipient, String sessionId, JingleReason reason) {
Jingle.Builder jb = Jingle.getBuilder();
jb.setAction(JingleAction.session_terminate)
@@ -184,6 +223,12 @@ public class JingleUtil {
return connection.createStanzaCollectorAndSend(jingle).nextResultOrThrow();
}
+ /**
+ * XEP-0166 Example 21.
+ * @param recipient
+ * @param sessionId
+ * @return
+ */
public Jingle createSessionTerminateDecline(FullJid recipient, String sessionId) {
return createSessionTerminate(recipient, sessionId, JingleReason.Reason.decline);
}
@@ -196,6 +241,12 @@ public class JingleUtil {
return connection.createStanzaCollectorAndSend(jingle).nextResultOrThrow();
}
+ /**
+ * XEP-0166 Example 19.
+ * @param recipient
+ * @param sessionId
+ * @return
+ */
public Jingle createSessionTerminateSuccess(FullJid recipient, String sessionId) {
return createSessionTerminate(recipient, sessionId, JingleReason.Reason.success);
}
@@ -208,6 +259,12 @@ public class JingleUtil {
return connection.createStanzaCollectorAndSend(jingle).nextResultOrThrow();
}
+ /**
+ * XEP-0166 Example 20.
+ * @param recipient
+ * @param sessionId
+ * @return
+ */
public Jingle createSessionTerminateBusy(FullJid recipient, String sessionId) {
return createSessionTerminate(recipient, sessionId, JingleReason.Reason.busy);
}
@@ -220,6 +277,13 @@ public class JingleUtil {
return connection.createStanzaCollectorAndSend(jingle).nextResultOrThrow();
}
+ /**
+ * XEP-0166 Example 22.
+ * @param recipient
+ * @param sessionId
+ * @param altSessionId
+ * @return
+ */
public Jingle createSessionTerminateAlternativeSession(FullJid recipient, String sessionId, String altSessionId) {
return createSessionTerminate(recipient, sessionId, JingleReason.AlternativeSession(altSessionId));
}
@@ -232,6 +296,13 @@ public class JingleUtil {
return connection.createStanzaCollectorAndSend(jingle).nextResultOrThrow();
}
+ /**
+ * XEP-0234 Example 9.
+ * Cancel all active transfers of the session.
+ * @param recipient
+ * @param sessionId
+ * @return
+ */
public Jingle createSessionTerminateCancel(FullJid recipient, String sessionId) {
return createSessionTerminate(recipient, sessionId, JingleReason.Reason.cancel);
}
@@ -245,6 +316,15 @@ public class JingleUtil {
return connection.createStanzaCollectorAndSend(jingle).nextResultOrThrow();
}
+ /**
+ * XEP-0234 Example 10.
+ * Cancel a single transfer.
+ * @param recipient
+ * @param sessionId
+ * @param contentCreator
+ * @param contentName
+ * @return
+ */
public Jingle createSessionTerminateContentCancel(FullJid recipient, String sessionId,
JingleContent.Creator contentCreator, String contentName) {
Jingle.Builder jb = Jingle.getBuilder();
@@ -269,6 +349,12 @@ public class JingleUtil {
return connection.createStanzaCollectorAndSend(jingle).nextResultOrThrow();
}
+ /**
+ * XEP-0166 Example 23.
+ * @param recipient
+ * @param sessionId
+ * @return
+ */
public Jingle createSessionTerminateUnsupportedTransports(FullJid recipient, String sessionId) {
return createSessionTerminate(recipient, sessionId, JingleReason.Reason.unsupported_transports);
}
@@ -280,6 +366,12 @@ public class JingleUtil {
return connection.createStanzaCollectorAndSend(jingle).nextResultOrThrow();
}
+ /**
+ * XEP-0166 Example 24.
+ * @param recipient
+ * @param sessionId
+ * @return
+ */
public Jingle createSessionTerminateFailedTransport(FullJid recipient, String sessionId) {
return createSessionTerminate(recipient, sessionId, JingleReason.Reason.failed_transport);
}
@@ -291,6 +383,12 @@ public class JingleUtil {
return connection.createStanzaCollectorAndSend(jingle).nextResultOrThrow();
}
+ /**
+ * XEP-0166 Example 25.
+ * @param recipient
+ * @param sessionId
+ * @return
+ */
public Jingle createSessionTerminateUnsupportedApplications(FullJid recipient, String sessionId) {
return createSessionTerminate(recipient, sessionId, JingleReason.Reason.unsupported_applications);
}
@@ -302,6 +400,12 @@ public class JingleUtil {
return connection.createStanzaCollectorAndSend(jingle).nextResultOrThrow();
}
+ /**
+ * XEP-0166 Example 26.
+ * @param recipient
+ * @param sessionId
+ * @return
+ */
public Jingle createSessionTerminateFailedApplication(FullJid recipient, String sessionId) {
return createSessionTerminate(recipient, sessionId, JingleReason.Reason.failed_application);
}
@@ -313,6 +417,12 @@ public class JingleUtil {
return connection.createStanzaCollectorAndSend(jingle).nextResultOrThrow();
}
+ /**
+ * XEP-0166 Example 27.
+ * @param recipient
+ * @param sessionId
+ * @return
+ */
public Jingle createSessionTerminateIncompatibleParameters(FullJid recipient, String sessionId) {
return createSessionTerminate(recipient, sessionId, JingleReason.Reason.incompatible_parameters);
}
@@ -328,6 +438,12 @@ public class JingleUtil {
return null; //TODO Later
}
+ /**
+ * XEP-0166 Example 32.
+ * @param recipient
+ * @param sessionId
+ * @return
+ */
public Jingle createSessionPing(FullJid recipient, String sessionId) {
Jingle.Builder jb = Jingle.getBuilder();
jb.setSessionId(sessionId)
@@ -347,6 +463,11 @@ public class JingleUtil {
return connection.createStanzaCollectorAndSend(jingle).nextResultOrThrow();
}
+ /**
+ * XEP-0166 Example 5.
+ * @param jingle
+ * @return
+ */
public IQ createAck(Jingle jingle) {
return IQ.createResultIQ(jingle);
}
@@ -355,6 +476,16 @@ public class JingleUtil {
connection.sendStanza(createAck(jingle));
}
+ /**
+ * XEP-0260 Example 15.
+ * @param recipient
+ * @param initiator
+ * @param sessionId
+ * @param contentCreator
+ * @param contentName
+ * @param transport
+ * @return
+ */
public Jingle createTransportReplace(FullJid recipient, FullJid initiator, String sessionId,
JingleContent.Creator contentCreator, String contentName,
JingleContentTransport transport) {
@@ -382,6 +513,16 @@ public class JingleUtil {
return connection.createStanzaCollectorAndSend(jingle).nextResultOrThrow();
}
+ /**
+ * XEP-0260 Example 17.
+ * @param recipient
+ * @param initiator
+ * @param sessionId
+ * @param contentCreator
+ * @param contentName
+ * @param transport
+ * @return
+ */
public Jingle createTransportAccept(FullJid recipient, FullJid initiator, String sessionId,
JingleContent.Creator contentCreator, String contentName,
JingleContentTransport transport) {
@@ -409,6 +550,16 @@ public class JingleUtil {
return connection.createStanzaCollectorAndSend(jingle).nextResultOrThrow();
}
+ /**
+ * XEP-0166 §7.2.14.
+ * @param recipient
+ * @param initiator
+ * @param sessionId
+ * @param contentCreator
+ * @param contentName
+ * @param transport
+ * @return
+ */
public Jingle createTransportReject(FullJid recipient, FullJid initiator, String sessionId,
JingleContent.Creator contentCreator, String contentName,
JingleContentTransport transport) {
@@ -440,6 +591,11 @@ public class JingleUtil {
* ####################################################################################################
*/
+ /**
+ * XEP-0166 Example 29.
+ * @param request request with unknown sessionId.
+ * @return error stanza.
+ */
public IQ createErrorUnknownSession(Jingle request) {
XMPPError.Builder error = XMPPError.getBuilder();
error.setCondition(XMPPError.Condition.item_not_found)
@@ -452,8 +608,14 @@ public class JingleUtil {
connection.sendStanza(createErrorUnknownSession(request));
}
+ /**
+ * XEP-0166 Example 12.
+ * @param request request from unknown initiator.
+ * @return error stanza.
+ */
public IQ createErrorUnknownInitiator(Jingle request) {
- return IQ.createErrorResponse(request, XMPPError.Condition.service_unavailable);
+ XMPPError.Builder b = XMPPError.getBuilder().setType(XMPPError.Type.CANCEL).setCondition(XMPPError.Condition.service_unavailable);
+ return IQ.createErrorResponse(request, b);
}
public void sendErrorUnknownInitiator(Jingle request)
@@ -461,6 +623,11 @@ public class JingleUtil {
connection.sendStanza(createErrorUnknownInitiator(request));
}
+ /**
+ * XEP-0166 Example 31.
+ * @param request request with unsupported info.
+ * @return error stanza.
+ */
public IQ createErrorUnsupportedInfo(Jingle request) {
XMPPError.Builder error = XMPPError.getBuilder();
error.setCondition(XMPPError.Condition.feature_not_implemented)
@@ -473,6 +640,11 @@ public class JingleUtil {
connection.sendStanza(createErrorUnsupportedInfo(request));
}
+ /**
+ * XEP-0166 Example 34.
+ * @param request tie-breaking request
+ * @return error stanza
+ */
public IQ createErrorTieBreak(Jingle request) {
XMPPError.Builder error = XMPPError.getBuilder();
error.setCondition(XMPPError.Condition.conflict)
diff --git a/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleSessionTest.java b/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleSessionTest.java
index ba502728a..abd65fe45 100644
--- a/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleSessionTest.java
+++ b/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleSessionTest.java
@@ -92,6 +92,7 @@ public class JingleSessionTest {
assertNotSame(initiatedSimpleSession, respondedSimpleSession);
assertFalse(initiatedSimpleSession.equals(respondedSimpleSession));
assertNotSame(initiatedSimpleSession.hashCode(), respondedSimpleSession.hashCode());
+ assertFalse(initiatedSimpleSession.equals("Hallo Welt"));
}
@Test
diff --git a/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleUtilTest.java b/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleUtilTest.java
index d2a81d8d0..1ced8fab6 100644
--- a/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleUtilTest.java
+++ b/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleUtilTest.java
@@ -21,6 +21,8 @@ import static junit.framework.TestCase.assertNotNull;
import static junit.framework.TestCase.assertTrue;
import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual;
+import java.io.IOException;
+
import org.jivesoftware.smack.DummyConnection;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.packet.IQ;
@@ -37,6 +39,7 @@ import org.junit.Test;
import org.jxmpp.jid.FullJid;
import org.jxmpp.jid.impl.JidCreate;
import org.jxmpp.stringprep.XmppStringprepException;
+import org.xml.sax.SAXException;
/**
@@ -264,6 +267,76 @@ public class JingleUtilTest extends SmackTestSuite {
assertXMLEqual(xml, error.toXML().toString());
}
+ @Test
+ public void createErrorTieBreakTest() throws IOException, SAXException {
+ Jingle j = defaultJingle(romeo, "thisistie");
+ IQ error = jutil.createErrorTieBreak(j);
+ String xml =
+ "" +
+ "" +
+ "" +
+ "" +
+ "" +
+ "";
+ assertXMLEqual(xml, error.toXML().toString());
+ }
+
+ @Test
+ public void createErrorUnknownSessionTest() throws IOException, SAXException {
+ Jingle j = defaultJingle(romeo, "youknownothingjohnsnow");
+ IQ error = jutil.createErrorUnknownSession(j);
+ String xml =
+ "" +
+ "" +
+ "" +
+ "" +
+ "" +
+ "";
+ assertXMLEqual(xml, error.toXML().toString());
+ }
+
+ @Test
+ public void createErrorUnknownInitiatorTest() throws IOException, SAXException {
+ Jingle j = defaultJingle(romeo, "iamyourfather");
+ IQ error = jutil.createErrorUnknownInitiator(j);
+ String xml =
+ "" +
+ "" +
+ "" +
+ "" +
+ "";
+ assertXMLEqual(xml, error.toXML().toString());
+ }
+
+ @Test
+ public void createErrorOutOfOrderTest() throws IOException, SAXException {
+ Jingle j = defaultJingle(romeo, "yourfatheriam");
+ IQ error = jutil.createErrorOutOfOrder(j);
+ String xml =
+ "" +
+ "" +
+ "" +
+ "" +
+ "";
+ assertXMLEqual(xml, error.toXML().toString());
+ }
+
private String getIQXML(FullJid from, FullJid to, String stanzaId, String jingleXML) {
return "" +
jingleXML +