From 185d569b89bbac9cf100313a9c6ef33259642c7f Mon Sep 17 00:00:00 2001 From: vanitasvitae Date: Fri, 28 Jul 2017 14:02:32 +0200 Subject: [PATCH] Progress --- .../smackx/jft/JingleFileTransferManager.java | 22 ++++- .../adapter/JingleFileTransferAdapter.java | 57 ++++++++++++ .../IncomingFileOfferController.java | 5 +- .../jft/internal/AbstractJingleFileOffer.java | 11 +-- .../internal/AbstractJingleFileRequest.java | 8 +- .../jft/internal/JingleFileTransfer.java | 16 ++++ .../jft/internal/JingleIncomingFileOffer.java | 20 ++++ .../internal/JingleIncomingFileRequest.java | 17 +++- .../jft/internal/JingleOutgoingFileOffer.java | 7 ++ .../internal/JingleOutgoingFileRequest.java | 13 ++- .../listener/IncomingFileOfferListener.java | 2 +- .../smackx/jingle/JingleManager.java | 4 +- .../adapter/JingleDescriptionAdapter.java | 4 +- .../jingle/components/JingleContent.java | 16 ++-- .../jingle/components/JingleSession.java | 28 +++++- .../jingle_ibb/JingleIBBTransportManager.java | 4 + .../jingle_s5b/JingleS5BTransportManager.java | 4 + ...rTest.java => JingleFileTransferTest.java} | 93 ++++++++++++------- 18 files changed, 266 insertions(+), 65 deletions(-) create mode 100644 smack-experimental/src/main/java/org/jivesoftware/smackx/jft/adapter/JingleFileTransferAdapter.java rename smack-integration-test/src/main/java/org/jivesoftware/smackx/jft/{FileTransferTest.java => JingleFileTransferTest.java} (56%) diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/JingleFileTransferManager.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/JingleFileTransferManager.java index 19795f7b7..08b31bd63 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/JingleFileTransferManager.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/JingleFileTransferManager.java @@ -23,8 +23,11 @@ import java.util.List; import java.util.WeakHashMap; 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.jft.adapter.JingleFileTransferAdapter; import org.jivesoftware.smackx.jft.controller.OutgoingFileOfferController; import org.jivesoftware.smackx.jft.controller.OutgoingFileRequestController; import org.jivesoftware.smackx.jft.internal.JingleFileTransfer; @@ -32,6 +35,7 @@ import org.jivesoftware.smackx.jft.internal.JingleIncomingFileOffer; import org.jivesoftware.smackx.jft.internal.JingleIncomingFileRequest; import org.jivesoftware.smackx.jft.internal.JingleOutgoingFileOffer; import org.jivesoftware.smackx.jft.internal.JingleOutgoingFileRequest; +import org.jivesoftware.smackx.jft.internal.file.RemoteFile; import org.jivesoftware.smackx.jft.listener.IncomingFileOfferListener; import org.jivesoftware.smackx.jft.listener.IncomingFileRequestListener; import org.jivesoftware.smackx.jft.provider.JingleFileTransferProvider; @@ -59,6 +63,10 @@ public final class JingleFileTransferManager extends Manager implements JingleDe private final List requestListeners = Collections.synchronizedList(new ArrayList()); + static { + JingleManager.addJingleDescriptionAdapter(new JingleFileTransferAdapter()); + } + private JingleFileTransferManager(XMPPConnection connection) { super(connection); ServiceDiscoveryManager.getInstanceFor(connection).addFeature(getNamespace()); @@ -78,7 +86,10 @@ public final class JingleFileTransferManager extends Manager implements JingleDe return manager; } - public OutgoingFileOfferController sendFile(File file, FullJid to) { + public OutgoingFileOfferController sendFile(File file, FullJid to) + throws SmackException.NotConnectedException, InterruptedException, XMPPException.XMPPErrorException, + SmackException.NoResponseException { + if (file == null || !file.exists()) { throw new IllegalArgumentException("File MUST NOT be null and MUST exist."); } @@ -94,12 +105,13 @@ public final class JingleFileTransferManager extends Manager implements JingleDe JingleTransportManager transportManager = jingleManager.getBestAvailableTransportManager(); content.setTransport(transportManager.createTransport(content)); - //TODO + session.initiate(connection()); + return offer; } - public OutgoingFileRequestController requestFile() { - JingleOutgoingFileRequest request = new JingleOutgoingFileRequest(); + public OutgoingFileRequestController requestFile(RemoteFile file) { + JingleOutgoingFileRequest request = new JingleOutgoingFileRequest(file); //TODO at some point. @@ -116,7 +128,7 @@ public final class JingleFileTransferManager extends Manager implements JingleDe public void notifyIncomingFileOfferListeners(JingleIncomingFileOffer offer) { for (IncomingFileOfferListener l : offerListeners) { - l.onIncomingFileTransfer(offer); + l.onIncomingFileOffer(offer); } } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/adapter/JingleFileTransferAdapter.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/adapter/JingleFileTransferAdapter.java new file mode 100644 index 000000000..dbc02cd4b --- /dev/null +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/adapter/JingleFileTransferAdapter.java @@ -0,0 +1,57 @@ +/** + * + * Copyright 2017 Paul Schaub + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smackx.jft.adapter; + +import java.util.List; + +import org.jivesoftware.smackx.jft.element.JingleFileTransferChildElement; +import org.jivesoftware.smackx.jft.element.JingleFileTransferElement; +import org.jivesoftware.smackx.jft.internal.JingleFileTransfer; +import org.jivesoftware.smackx.jft.internal.JingleIncomingFileOffer; +import org.jivesoftware.smackx.jft.internal.JingleIncomingFileRequest; +import org.jivesoftware.smackx.jingle.adapter.JingleDescriptionAdapter; +import org.jivesoftware.smackx.jingle.element.JingleContentDescriptionChildElement; +import org.jivesoftware.smackx.jingle.element.JingleContentDescriptionElement; +import org.jivesoftware.smackx.jingle.element.JingleContentElement; + +/** + * Created by vanitas on 28.07.17. + */ +public class JingleFileTransferAdapter implements JingleDescriptionAdapter { + + @Override + public JingleFileTransfer descriptionFromElement(JingleContentElement.Creator creator, JingleContentElement.Senders senders, + String contentName, String contentDisposition, JingleContentDescriptionElement element) { + JingleFileTransferElement description = (JingleFileTransferElement) element; + List childs = description.getJingleContentDescriptionChildren(); + assert childs.size() == 1; + JingleFileTransferChildElement file = (JingleFileTransferChildElement) childs.get(0); + + if (senders == JingleContentElement.Senders.initiator) { + return new JingleIncomingFileOffer(file); + } else if (senders == JingleContentElement.Senders.responder) { + return new JingleIncomingFileRequest(file); + } else { + throw new AssertionError("Senders attribute MUST be either initiator or responder. Is: " + senders); + } + } + + @Override + public String getNamespace() { + return JingleFileTransfer.NAMESPACE; + } +} diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/controller/IncomingFileOfferController.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/controller/IncomingFileOfferController.java index d726688dc..50f27cb33 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/controller/IncomingFileOfferController.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/controller/IncomingFileOfferController.java @@ -16,9 +16,12 @@ */ package org.jivesoftware.smackx.jft.controller; +import java.io.File; +import java.util.concurrent.Future; + /** * Created by vanitas on 27.07.17. */ public interface IncomingFileOfferController extends JingleFileTransferController { - + Future accept(File target); } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/AbstractJingleFileOffer.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/AbstractJingleFileOffer.java index 2499a77f5..cc9037077 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/AbstractJingleFileOffer.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/AbstractJingleFileOffer.java @@ -16,7 +16,6 @@ */ package org.jivesoftware.smackx.jft.internal; -import org.jivesoftware.smackx.jft.element.JingleFileTransferElement; import org.jivesoftware.smackx.jft.internal.file.AbstractJingleFileTransferFile; /** @@ -24,15 +23,7 @@ import org.jivesoftware.smackx.jft.internal.file.AbstractJingleFileTransferFile; */ public abstract class AbstractJingleFileOffer extends JingleFileTransfer { - protected D jingleFile; - public AbstractJingleFileOffer(D fileTransferFile) { - super(); - this.jingleFile = fileTransferFile; - } - - @Override - public JingleFileTransferElement getElement() { - return new JingleFileTransferElement(jingleFile.getElement()); + super(fileTransferFile); } } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/AbstractJingleFileRequest.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/AbstractJingleFileRequest.java index 9b2b225f2..0ac399a3f 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/AbstractJingleFileRequest.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/AbstractJingleFileRequest.java @@ -16,9 +16,15 @@ */ package org.jivesoftware.smackx.jft.internal; +import org.jivesoftware.smackx.jft.internal.file.AbstractJingleFileTransferFile; + /** * Created by vanitas on 22.07.17. */ -public abstract class AbstractJingleFileRequest extends JingleFileTransfer { +public abstract class AbstractJingleFileRequest extends JingleFileTransfer { + + public AbstractJingleFileRequest(D fileTransferFile) { + super(fileTransferFile); + } } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/JingleFileTransfer.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/JingleFileTransfer.java index 2531d4449..4df3f8fe8 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/JingleFileTransfer.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/JingleFileTransfer.java @@ -22,6 +22,7 @@ import java.util.List; import org.jivesoftware.smackx.jft.controller.JingleFileTransferController; import org.jivesoftware.smackx.jft.element.JingleFileTransferElement; +import org.jivesoftware.smackx.jft.internal.file.AbstractJingleFileTransferFile; import org.jivesoftware.smackx.jft.listener.ProgressListener; import org.jivesoftware.smackx.jingle.components.JingleDescription; @@ -37,9 +38,14 @@ public abstract class JingleFileTransfer extends JingleDescription progressListeners = Collections.synchronizedList(new ArrayList()); + public JingleFileTransfer(AbstractJingleFileTransferFile file) { + this.file = file; + } + @Override public void addProgressListener(ProgressListener listener) { progressListeners.add(listener); @@ -57,6 +63,16 @@ public abstract class JingleFileTransfer extends JingleDescription super(new RemoteFile(offer)); } + @Override + public JingleElement handleDescriptionInfo(JingleContentDescriptionInfoElement info) { + return null; + } + @Override public void onTransportReady(BytestreamSession bytestreamSession) { InputStream inputStream; @@ -57,4 +67,14 @@ public class JingleIncomingFileOffer extends AbstractJingleFileOffer public boolean isRequest() { return false; } + + @Override + public Future accept(File target) { + JingleSession session = getParent().getParent(); + if (session.getSessionState() == JingleSession.SessionState.pending) { + //session.accept(); + } + + return null; + } } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/JingleIncomingFileRequest.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/JingleIncomingFileRequest.java index 605142b38..2fbf3b077 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/JingleIncomingFileRequest.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/JingleIncomingFileRequest.java @@ -18,17 +18,32 @@ package org.jivesoftware.smackx.jft.internal; import org.jivesoftware.smackx.bytestreams.BytestreamSession; import org.jivesoftware.smackx.jft.controller.IncomingFileRequestController; +import org.jivesoftware.smackx.jft.element.JingleFileTransferChildElement; import org.jivesoftware.smackx.jft.element.JingleFileTransferElement; +import org.jivesoftware.smackx.jft.internal.file.RemoteFile; +import org.jivesoftware.smackx.jingle.element.JingleContentDescriptionInfoElement; +import org.jivesoftware.smackx.jingle.element.JingleElement; /** * Created by vanitas on 27.07.17. + * TODO: RemoteFile???? */ -public class JingleIncomingFileRequest extends AbstractJingleFileRequest implements IncomingFileRequestController { +public class JingleIncomingFileRequest extends AbstractJingleFileRequest implements IncomingFileRequestController { + + public JingleIncomingFileRequest(JingleFileTransferChildElement request) { + super(new RemoteFile(request)); + } + @Override public JingleFileTransferElement getElement() { return null; } + @Override + public JingleElement handleDescriptionInfo(JingleContentDescriptionInfoElement info) { + return null; + } + @Override public boolean isOffer() { return false; diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/JingleOutgoingFileOffer.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/JingleOutgoingFileOffer.java index 82d987dab..4cdc3df03 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/JingleOutgoingFileOffer.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/JingleOutgoingFileOffer.java @@ -21,6 +21,8 @@ import java.io.File; import org.jivesoftware.smackx.bytestreams.BytestreamSession; import org.jivesoftware.smackx.jft.controller.OutgoingFileOfferController; import org.jivesoftware.smackx.jft.internal.file.LocalFile; +import org.jivesoftware.smackx.jingle.element.JingleContentDescriptionInfoElement; +import org.jivesoftware.smackx.jingle.element.JingleElement; /** * Created by vanitas on 26.07.17. @@ -31,6 +33,11 @@ public class JingleOutgoingFileOffer extends AbstractJingleFileOffer super(new LocalFile(file)); } + @Override + public JingleElement handleDescriptionInfo(JingleContentDescriptionInfoElement info) { + return null; + } + @Override public void onTransportReady(BytestreamSession bytestreamSession) { diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/JingleOutgoingFileRequest.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/JingleOutgoingFileRequest.java index 219273d4c..b71697164 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/JingleOutgoingFileRequest.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/internal/JingleOutgoingFileRequest.java @@ -18,14 +18,21 @@ package org.jivesoftware.smackx.jft.internal; import org.jivesoftware.smackx.bytestreams.BytestreamSession; import org.jivesoftware.smackx.jft.controller.OutgoingFileRequestController; -import org.jivesoftware.smackx.jft.element.JingleFileTransferElement; +import org.jivesoftware.smackx.jft.internal.file.RemoteFile; +import org.jivesoftware.smackx.jingle.element.JingleContentDescriptionInfoElement; +import org.jivesoftware.smackx.jingle.element.JingleElement; /** * Created by vanitas on 27.07.17. */ -public class JingleOutgoingFileRequest extends AbstractJingleFileRequest implements OutgoingFileRequestController { +public class JingleOutgoingFileRequest extends AbstractJingleFileRequest implements OutgoingFileRequestController { + + public JingleOutgoingFileRequest(RemoteFile file) { + super(file); + } + @Override - public JingleFileTransferElement getElement() { + public JingleElement handleDescriptionInfo(JingleContentDescriptionInfoElement info) { return null; } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/listener/IncomingFileOfferListener.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/listener/IncomingFileOfferListener.java index a25182bda..e8616a43c 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/listener/IncomingFileOfferListener.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/listener/IncomingFileOfferListener.java @@ -23,5 +23,5 @@ import org.jivesoftware.smackx.jft.controller.IncomingFileOfferController; */ public interface IncomingFileOfferListener { - void onIncomingFileTransfer(IncomingFileOfferController offer); + void onIncomingFileOffer(IncomingFileOfferController offer); } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleManager.java index 0eabe3128..acb354e17 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleManager.java @@ -243,10 +243,10 @@ public final class JingleManager extends Manager { JingleSession session; if (role == Role.initiator) { - session = new JingleSession(this, connection().getUser().asDomainFullJidOrThrow(), peer, + session = new JingleSession(this, connection().getUser().asFullJidOrThrow(), peer, role, StringUtils.randomString(24)); } else { - session = new JingleSession(this, peer, connection().getUser().asDomainFullJidOrThrow(), + session = new JingleSession(this, peer, connection().getUser().asFullJidOrThrow(), role, StringUtils.randomString(24)); } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/adapter/JingleDescriptionAdapter.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/adapter/JingleDescriptionAdapter.java index fe197afda..140f6dd52 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/adapter/JingleDescriptionAdapter.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/adapter/JingleDescriptionAdapter.java @@ -18,13 +18,15 @@ package org.jivesoftware.smackx.jingle.adapter; import org.jivesoftware.smackx.jingle.components.JingleDescription; import org.jivesoftware.smackx.jingle.element.JingleContentDescriptionElement; +import org.jivesoftware.smackx.jingle.element.JingleContentElement; /** * Adapter that creates a Description object from an element. */ public interface JingleDescriptionAdapter> { - D descriptionFromElement(JingleContentDescriptionElement element); + D descriptionFromElement(JingleContentElement.Creator creator, JingleContentElement.Senders senders, + String contentName, String contentDisposition, JingleContentDescriptionElement element); String getNamespace(); } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/components/JingleContent.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/components/JingleContent.java index 91dd4c21b..0c4990c1e 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/components/JingleContent.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/components/JingleContent.java @@ -95,7 +95,7 @@ public class JingleContent implements JingleTransportCallback { if (descriptionElement != null) { JingleDescriptionAdapter descriptionAdapter = JingleManager.getJingleDescriptionAdapter(content.getDescription().getNamespace()); if (descriptionAdapter != null) { - description = descriptionAdapter.descriptionFromElement(descriptionElement); + description = descriptionAdapter.descriptionFromElement(content.getCreator(), content.getSenders(), content.getName(), content.getDisposition(), descriptionElement); } else { throw new AssertionError("DescriptionProvider for " + descriptionElement.getNamespace() + " seems to be registered, but no corresponding JingleDescriptionAdapter was found."); @@ -108,7 +108,7 @@ public class JingleContent implements JingleTransportCallback { if (transportAdapter != null) { transport = transportAdapter.transportFromElement(transportElement); } else { - throw new AssertionError("DescriptionProvider for " + transportElement.getNamespace() + + throw new AssertionError("TransportProvider for " + transportElement.getNamespace() + " seems to be registered, but no corresponding JingleTransportAdapter was found."); } } @@ -132,15 +132,19 @@ public class JingleContent implements JingleTransportCallback { } public JingleContentElement getElement() { - return JingleContentElement.getBuilder() + JingleContentElement.Builder builder = JingleContentElement.getBuilder() .setName(name) .setCreator(creator) .setSenders(senders) .setDescription(description.getElement()) .setTransport(transport.getElement()) - .setSecurity(security.getElement()) - .setDisposition(disposition) - .build(); + .setDisposition(disposition); + + if (security != null) { + builder.setSecurity(security.getElement()); + } + + return builder.build(); } public Set getTransportBlacklist() { diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/components/JingleSession.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/components/JingleSession.java index 0ac39515d..6f0cc0d71 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/components/JingleSession.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/components/JingleSession.java @@ -27,6 +27,7 @@ import java.util.logging.Level; import java.util.logging.Logger; 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.Async; @@ -60,6 +61,15 @@ public class JingleSession { private final Role role; private final String sessionId; + public enum SessionState { + fresh, //pre-session-inititate + pending, //pre-session-accept + active, //pre-session-terminate + ended //post-session-terminate + } + + private SessionState sessionState; + private final Map pendingJingleActions = Collections.synchronizedMap(new HashMap()); @@ -69,6 +79,7 @@ public class JingleSession { this.responder = responder; this.role = role; this.sessionId = sessionId; + this.sessionState = SessionState.fresh; } public void addContent(JingleContent content) { @@ -114,9 +125,16 @@ public class JingleSession { session.addContent(content); } + session.sessionState = SessionState.pending; + return session; } + public void initiate(XMPPConnection connection) throws SmackException.NotConnectedException, InterruptedException, XMPPException.XMPPErrorException, SmackException.NoResponseException { + connection.createStanzaCollectorAndSend(createSessionInitiate()).nextResultOrThrow(); + this.sessionState = SessionState.pending; + } + public JingleElement createSessionInitiate() { if (role != Role.initiator) { throw new IllegalStateException("Sessions role is not initiator."); @@ -216,6 +234,7 @@ public class JingleSession { } private IQ handleSessionTerminate(JingleElement request) { + this.sessionState = SessionState.ended; JingleReasonElement reason = request.getReason(); if (reason == null) { @@ -223,7 +242,6 @@ public class JingleSession { } //TODO: Inform client. - jingleManager.removeSession(this); return IQ.createResultIQ(request); @@ -231,7 +249,9 @@ public class JingleSession { private IQ handleTransportReject(JingleElement request) { HashMap affectedContents = getAffectedContents(request); + for (JingleContent c : affectedContents.values()) { + } return null; } @@ -283,6 +303,8 @@ public class JingleSession { } private IQ handleSessionAccept(JingleElement request) { + this.sessionState = SessionState.active; + return null; } @@ -430,4 +452,8 @@ public class JingleSession { } return map; } + + public SessionState getSessionState() { + return sessionState; + } } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_ibb/JingleIBBTransportManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_ibb/JingleIBBTransportManager.java index 44b8441bf..1d9efba66 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_ibb/JingleIBBTransportManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_ibb/JingleIBBTransportManager.java @@ -37,6 +37,10 @@ public final class JingleIBBTransportManager extends Manager implements JingleTr private static final WeakHashMap INSTANCES = new WeakHashMap<>(); + static { + JingleManager.addJingleTransportAdapter(new JingleIBBTransportAdapter()); + } + private JingleIBBTransportManager(XMPPConnection connection) { super(connection); ServiceDiscoveryManager.getInstanceFor(connection).addFeature(getNamespace()); diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_s5b/JingleS5BTransportManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_s5b/JingleS5BTransportManager.java index 4b9eca633..64d7d0234 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_s5b/JingleS5BTransportManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_s5b/JingleS5BTransportManager.java @@ -68,6 +68,10 @@ public final class JingleS5BTransportManager extends Manager implements JingleTr private static boolean useLocalCandidates = true; private static boolean useExternalCandidates = true; + static { + JingleManager.addJingleTransportAdapter(new JingleS5BTransportAdapter()); + } + private JingleS5BTransportManager(XMPPConnection connection) { super(connection); ServiceDiscoveryManager.getInstanceFor(connection).addFeature(getNamespace()); diff --git a/smack-integration-test/src/main/java/org/jivesoftware/smackx/jft/FileTransferTest.java b/smack-integration-test/src/main/java/org/jivesoftware/smackx/jft/JingleFileTransferTest.java similarity index 56% rename from smack-integration-test/src/main/java/org/jivesoftware/smackx/jft/FileTransferTest.java rename to smack-integration-test/src/main/java/org/jivesoftware/smackx/jft/JingleFileTransferTest.java index 06eb91ebd..95b68c28f 100644 --- a/smack-integration-test/src/main/java/org/jivesoftware/smackx/jft/FileTransferTest.java +++ b/smack-integration-test/src/main/java/org/jivesoftware/smackx/jft/JingleFileTransferTest.java @@ -16,20 +16,35 @@ */ package org.jivesoftware.smackx.jft; +import static junit.framework.TestCase.fail; +import static org.junit.Assert.assertArrayEquals; + import java.io.File; +import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.util.ArrayList; +import java.util.concurrent.Future; +import java.util.logging.Level; import org.jivesoftware.smackx.bytestreams.socks5.Socks5Proxy; +import org.jivesoftware.smackx.jft.controller.IncomingFileOfferController; +import org.jivesoftware.smackx.jft.controller.OutgoingFileOfferController; +import org.jivesoftware.smackx.jft.listener.IncomingFileOfferListener; +import org.jivesoftware.smackx.jft.listener.ProgressListener; +import org.jivesoftware.smackx.jingle.transport.jingle_ibb.JingleIBBTransportManager; import org.igniterealtime.smack.inttest.AbstractSmackIntegrationTest; +import org.igniterealtime.smack.inttest.SmackIntegrationTest; import org.igniterealtime.smack.inttest.SmackIntegrationTestEnvironment; +import org.igniterealtime.smack.inttest.util.SimpleResultSyncPoint; import org.junit.AfterClass; +import org.jxmpp.jid.FullJid; /** * Created by vanitas on 29.06.17. */ -public class FileTransferTest extends AbstractSmackIntegrationTest { +public class JingleFileTransferTest extends AbstractSmackIntegrationTest { private static final File tempDir; @@ -43,13 +58,16 @@ public class FileTransferTest extends AbstractSmackIntegrationTest { } } - public FileTransferTest(SmackIntegrationTestEnvironment environment) { + public JingleFileTransferTest(SmackIntegrationTestEnvironment environment) { super(environment); } - /* @SmackIntegrationTest - public void basicFileTransferTest() { + public void basicFileTransferTest() throws Exception { + JingleIBBTransportManager.getInstanceFor(conOne); + JingleIBBTransportManager.getInstanceFor(conTwo); + + final SimpleResultSyncPoint resultSyncPoint1 = new SimpleResultSyncPoint(); final SimpleResultSyncPoint resultSyncPoint2 = new SimpleResultSyncPoint(); @@ -59,45 +77,55 @@ public class FileTransferTest extends AbstractSmackIntegrationTest { File source = prepareNewTestFile("source"); final File target = new File(tempDir, "target"); - JingleFileTransferManagerAlt aftm = JingleFileTransferManagerAlt.getInstanceFor(conOne); - JingleFileTransferManagerAlt bftm = JingleFileTransferManagerAlt.getInstanceFor(conTwo); + JingleFileTransferManager aftm = JingleFileTransferManager.getInstanceFor(conOne); + JingleFileTransferManager bftm = JingleFileTransferManager.getInstanceFor(conTwo); - bftm.addJingleFileTransferOfferListener(new JingleFileTransferOfferListener() { + final ArrayList> receiveFuture = new ArrayList<>(); //Uglaay + + bftm.addIncomingFileOfferListener(new IncomingFileOfferListener() { @Override - public void onFileOffer(JingleElement request, IncomingFileOfferCallback callback) { - FileTransferHandler handler2 = callback.acceptIncomingFileOffer(request, target); - handler2.addEndedListener(new FileTransferHandler.EndedListener() { + public void onIncomingFileOffer(IncomingFileOfferController offer) { + LOGGER.log(Level.INFO, "INCOMING FILE TRANSFER!"); + offer.addProgressListener(new ProgressListener() { @Override - public void onEnded(JingleReasonElement.Reason reason) { + public void started() { + + } + + @Override + public void progress(float percent) { + + } + + @Override + public void finished() { resultSyncPoint2.signal(); } }); + receiveFuture.add(offer.accept(target)); } }); - try { - FileTransferHandler handler = aftm.sendFile(bob, source); - handler.addEndedListener(new FileTransferHandler.EndedListener() { - @Override - public void onEnded(JingleReasonElement.Reason reason) { - resultSyncPoint1.signal(); - } - }); - } catch (InterruptedException | SmackException.NoResponseException | SmackException.NotConnectedException | XMPPException.XMPPErrorException e) { - fail(); - } + OutgoingFileOfferController sending = aftm.sendFile(source, bob); + sending.addProgressListener(new ProgressListener() { + @Override + public void started() { - try { - resultSyncPoint1.waitForResult(10 * 1000); - } catch (Exception e) { - fail(); - } + } - try { - resultSyncPoint2.waitForResult(10 * 1000); - } catch (Exception e) { - fail(); - } + @Override + public void progress(float percent) { + + } + + @Override + public void finished() { + resultSyncPoint1.signal(); + } + }); + + resultSyncPoint1.waitForResult(60 * 1000); + resultSyncPoint2.waitForResult(60 * 1000); byte[] sBytes = new byte[(int) source.length()]; byte[] tBytes = new byte[(int) target.length()]; @@ -116,7 +144,6 @@ public class FileTransferTest extends AbstractSmackIntegrationTest { LOGGER.log(Level.INFO, "SUCCESSFULLY SENT AND RECEIVED"); } - */ private File prepareNewTestFile(String name) { File testFile = new File(tempDir, name);