mirror of
https://github.com/vanitasvitae/Smack.git
synced 2024-11-24 04:52:05 +01:00
Merge branch 'jftPR' into jetPR
This commit is contained in:
commit
1ec9768f58
9 changed files with 85 additions and 48 deletions
|
@ -40,6 +40,7 @@ public abstract class JingleFileTransfer extends JingleDescription<JingleFileTra
|
||||||
|
|
||||||
protected State state;
|
protected State state;
|
||||||
protected JingleFile metadata;
|
protected JingleFile metadata;
|
||||||
|
protected float percentage;
|
||||||
|
|
||||||
private final List<ProgressListener> progressListeners = Collections.synchronizedList(new ArrayList<ProgressListener>());
|
private final List<ProgressListener> progressListeners = Collections.synchronizedList(new ArrayList<ProgressListener>());
|
||||||
|
|
||||||
|
@ -83,29 +84,41 @@ public abstract class JingleFileTransfer extends JingleDescription<JingleFileTra
|
||||||
getParent().onContentCancel();
|
getParent().onContentCancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void notifyProgressListeners(float progress) {
|
|
||||||
for (ProgressListener p : progressListeners) {
|
|
||||||
p.progress(progress);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void notifyProgressListenersFinished() {
|
|
||||||
for (ProgressListener p : progressListeners) {
|
|
||||||
p.finished();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void notifyProgressListenersStarted() {
|
public void notifyProgressListenersStarted() {
|
||||||
for (ProgressListener p : progressListeners) {
|
for (ProgressListener p : progressListeners) {
|
||||||
p.started();
|
p.started();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void notifyProgressListenersTerminated(JingleReasonElement.Reason reason) {
|
||||||
|
for (ProgressListener p : progressListeners) {
|
||||||
|
p.terminated(reason);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return progress as a float value between 0 and 1.
|
||||||
|
* If the transmission has not yet started, return -1.
|
||||||
|
* @return -1 or percentage in [0,1]
|
||||||
|
*/
|
||||||
|
public float getPercentage() {
|
||||||
|
if (state == State.pending || state == State.negotiating) {
|
||||||
|
return -1f;
|
||||||
|
}
|
||||||
|
|
||||||
|
return percentage;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getNamespace() {
|
public String getNamespace() {
|
||||||
return JingleFileTransfer.NAMESPACE;
|
return JingleFileTransfer.NAMESPACE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleContentTerminate(JingleReasonElement.Reason reason) {
|
||||||
|
notifyProgressListenersTerminated(reason);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public JingleFileTransferElement getElement() {
|
public JingleFileTransferElement getElement() {
|
||||||
return new JingleFileTransferElement(metadata.getElement());
|
return new JingleFileTransferElement(metadata.getElement());
|
||||||
|
|
|
@ -36,6 +36,7 @@ import org.jivesoftware.smackx.hashes.element.HashElement;
|
||||||
import org.jivesoftware.smackx.jingle.component.JingleSession;
|
import org.jivesoftware.smackx.jingle.component.JingleSession;
|
||||||
import org.jivesoftware.smackx.jingle.element.JingleContentDescriptionInfoElement;
|
import org.jivesoftware.smackx.jingle.element.JingleContentDescriptionInfoElement;
|
||||||
import org.jivesoftware.smackx.jingle.element.JingleElement;
|
import org.jivesoftware.smackx.jingle.element.JingleElement;
|
||||||
|
import org.jivesoftware.smackx.jingle.element.JingleReasonElement;
|
||||||
import org.jivesoftware.smackx.jingle_filetransfer.controller.IncomingFileOfferController;
|
import org.jivesoftware.smackx.jingle_filetransfer.controller.IncomingFileOfferController;
|
||||||
import org.jivesoftware.smackx.jingle_filetransfer.element.JingleFileTransferChildElement;
|
import org.jivesoftware.smackx.jingle_filetransfer.element.JingleFileTransferChildElement;
|
||||||
|
|
||||||
|
@ -97,6 +98,9 @@ public class JingleIncomingFileOffer extends AbstractJingleFileOffer implements
|
||||||
target.write(bufbuf, 0, length);
|
target.write(bufbuf, 0, length);
|
||||||
read += length;
|
read += length;
|
||||||
LOGGER.log(Level.INFO, "Read " + read + " (" + length + ") of " + metadata.getSize() + " bytes.");
|
LOGGER.log(Level.INFO, "Read " + read + " (" + length + ") of " + metadata.getSize() + " bytes.");
|
||||||
|
|
||||||
|
percentage = ((float) read) / ((float) metadata.getSize());
|
||||||
|
|
||||||
if (read == (int) metadata.getSize()) {
|
if (read == (int) metadata.getSize()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -133,7 +137,7 @@ public class JingleIncomingFileOffer extends AbstractJingleFileOffer implements
|
||||||
LOGGER.log(Level.INFO, "CHECKSUM MATCHED :)");
|
LOGGER.log(Level.INFO, "CHECKSUM MATCHED :)");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
notifyProgressListenersFinished();
|
notifyProgressListenersTerminated(JingleReasonElement.Reason.success);
|
||||||
getParent().onContentFinished();
|
getParent().onContentFinished();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@ import java.util.logging.Logger;
|
||||||
import org.jivesoftware.smackx.bytestreams.BytestreamSession;
|
import org.jivesoftware.smackx.bytestreams.BytestreamSession;
|
||||||
import org.jivesoftware.smackx.jingle.element.JingleContentDescriptionInfoElement;
|
import org.jivesoftware.smackx.jingle.element.JingleContentDescriptionInfoElement;
|
||||||
import org.jivesoftware.smackx.jingle.element.JingleElement;
|
import org.jivesoftware.smackx.jingle.element.JingleElement;
|
||||||
|
import org.jivesoftware.smackx.jingle.element.JingleReasonElement;
|
||||||
import org.jivesoftware.smackx.jingle_filetransfer.controller.OutgoingFileOfferController;
|
import org.jivesoftware.smackx.jingle_filetransfer.controller.OutgoingFileOfferController;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -66,6 +67,8 @@ public class JingleOutgoingFileOffer extends AbstractJingleFileOffer implements
|
||||||
|
|
||||||
byte[] buf = new byte[8192];
|
byte[] buf = new byte[8192];
|
||||||
|
|
||||||
|
int written = 0;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
if (getState() == State.cancelled) {
|
if (getState() == State.cancelled) {
|
||||||
break;
|
break;
|
||||||
|
@ -75,6 +78,8 @@ public class JingleOutgoingFileOffer extends AbstractJingleFileOffer implements
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
outputStream.write(buf, 0, r);
|
outputStream.write(buf, 0, r);
|
||||||
|
written += r;
|
||||||
|
percentage = ((float) getMetadata().getSize()) / ((float) written);
|
||||||
}
|
}
|
||||||
|
|
||||||
outputStream.flush();
|
outputStream.flush();
|
||||||
|
@ -91,7 +96,7 @@ public class JingleOutgoingFileOffer extends AbstractJingleFileOffer implements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
notifyProgressListenersFinished();
|
notifyProgressListenersTerminated(JingleReasonElement.Reason.success);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -16,6 +16,8 @@
|
||||||
*/
|
*/
|
||||||
package org.jivesoftware.smackx.jingle_filetransfer.listener;
|
package org.jivesoftware.smackx.jingle_filetransfer.listener;
|
||||||
|
|
||||||
|
import org.jivesoftware.smackx.jingle.element.JingleReasonElement;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by vanitas on 27.07.17.
|
* Created by vanitas on 27.07.17.
|
||||||
*/
|
*/
|
||||||
|
@ -23,7 +25,5 @@ public interface ProgressListener {
|
||||||
|
|
||||||
void started();
|
void started();
|
||||||
|
|
||||||
void progress(float percent);
|
void terminated(JingleReasonElement.Reason reason);
|
||||||
|
|
||||||
void finished();
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -480,6 +480,10 @@ public class JingleContent implements JingleTransportCallback, JingleSecurityCal
|
||||||
session.onContentCancel(this);
|
session.onContentCancel(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void handleContentTerminate(JingleReasonElement.Reason reason) {
|
||||||
|
description.handleContentTerminate(reason);
|
||||||
|
}
|
||||||
|
|
||||||
private void replaceTransport(Set<String> blacklist, XMPPConnection connection)
|
private void replaceTransport(Set<String> blacklist, XMPPConnection connection)
|
||||||
throws SmackException.NotConnectedException, InterruptedException,
|
throws SmackException.NotConnectedException, InterruptedException,
|
||||||
XMPPException.XMPPErrorException, SmackException.NoResponseException {
|
XMPPException.XMPPErrorException, SmackException.NoResponseException {
|
||||||
|
|
|
@ -20,6 +20,7 @@ import org.jivesoftware.smackx.bytestreams.BytestreamSession;
|
||||||
import org.jivesoftware.smackx.jingle.element.JingleContentDescriptionElement;
|
import org.jivesoftware.smackx.jingle.element.JingleContentDescriptionElement;
|
||||||
import org.jivesoftware.smackx.jingle.element.JingleContentDescriptionInfoElement;
|
import org.jivesoftware.smackx.jingle.element.JingleContentDescriptionInfoElement;
|
||||||
import org.jivesoftware.smackx.jingle.element.JingleElement;
|
import org.jivesoftware.smackx.jingle.element.JingleElement;
|
||||||
|
import org.jivesoftware.smackx.jingle.element.JingleReasonElement;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class that represents a contents description component.
|
* Class that represents a contents description component.
|
||||||
|
@ -45,4 +46,6 @@ public abstract class JingleDescription<D extends JingleContentDescriptionElemen
|
||||||
public abstract void onBytestreamReady(BytestreamSession bytestreamSession);
|
public abstract void onBytestreamReady(BytestreamSession bytestreamSession);
|
||||||
|
|
||||||
public abstract String getNamespace();
|
public abstract String getNamespace();
|
||||||
|
|
||||||
|
public abstract void handleContentTerminate(JingleReasonElement.Reason reason);
|
||||||
}
|
}
|
||||||
|
|
|
@ -145,6 +145,10 @@ public class JingleSession {
|
||||||
return JingleElement.createSessionAccept(getInitiator(), getResponder(), getSessionId(), contentElements);
|
return JingleElement.createSessionAccept(getInitiator(), getResponder(), getSessionId(), contentElements);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle local content finished event. This includes terminating the session.
|
||||||
|
* @param jingleContent content which finished.
|
||||||
|
*/
|
||||||
void onContentFinished(JingleContent jingleContent) {
|
void onContentFinished(JingleContent jingleContent) {
|
||||||
if (contents.get(jingleContent.getName()) == null) {
|
if (contents.get(jingleContent.getName()) == null) {
|
||||||
LOGGER.log(Level.WARNING, "Session does not contain content " + jingleContent.getName() + ". Ignore contentFinished.");
|
LOGGER.log(Level.WARNING, "Session does not contain content " + jingleContent.getName() + ". Ignore contentFinished.");
|
||||||
|
@ -169,6 +173,11 @@ public class JingleSession {
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle local content cancel event. This happens when the local user cancels a content.
|
||||||
|
* If there is only one content in the session, terminate the session, otherwise just cancel the one content.
|
||||||
|
* @param jingleContent content that gets cancelled.
|
||||||
|
*/
|
||||||
void onContentCancel(JingleContent jingleContent) {
|
void onContentCancel(JingleContent jingleContent) {
|
||||||
if (contents.get(jingleContent.getName()) == null) {
|
if (contents.get(jingleContent.getName()) == null) {
|
||||||
LOGGER.log(Level.WARNING, "Session does not contain content " + jingleContent.getName() + ". Ignore onContentCancel.");
|
LOGGER.log(Level.WARNING, "Session does not contain content " + jingleContent.getName() + ". Ignore onContentCancel.");
|
||||||
|
@ -188,6 +197,10 @@ public class JingleSession {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a session terminate and remove the session from the list of active sessions.
|
||||||
|
* @param reason reason of termination.
|
||||||
|
*/
|
||||||
public void terminateSession(JingleReasonElement.Reason reason) {
|
public void terminateSession(JingleReasonElement.Reason reason) {
|
||||||
try {
|
try {
|
||||||
jingleManager.getConnection().createStanzaCollectorAndSend(JingleElement.createSessionTerminate(getPeer(), getSessionId(), reason));
|
jingleManager.getConnection().createStanzaCollectorAndSend(JingleElement.createSessionTerminate(getPeer(), getSessionId(), reason));
|
||||||
|
@ -285,7 +298,12 @@ public class JingleSession {
|
||||||
throw new AssertionError("Reason MUST not be null! (I guess)...");
|
throw new AssertionError("Reason MUST not be null! (I guess)...");
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: Inform client.
|
JingleReasonElement.Reason r = reason.asEnum();
|
||||||
|
|
||||||
|
for (JingleContent content : contents.values()) {
|
||||||
|
content.handleContentTerminate(r);
|
||||||
|
}
|
||||||
|
|
||||||
jingleManager.removeSession(this);
|
jingleManager.removeSession(this);
|
||||||
|
|
||||||
return IQ.createResultIQ(request);
|
return IQ.createResultIQ(request);
|
||||||
|
|
|
@ -30,6 +30,7 @@ import java.util.logging.Level;
|
||||||
import org.jivesoftware.smack.SmackException;
|
import org.jivesoftware.smack.SmackException;
|
||||||
import org.jivesoftware.smack.XMPPException;
|
import org.jivesoftware.smack.XMPPException;
|
||||||
import org.jivesoftware.smackx.bytestreams.socks5.Socks5Proxy;
|
import org.jivesoftware.smackx.bytestreams.socks5.Socks5Proxy;
|
||||||
|
import org.jivesoftware.smackx.jingle.element.JingleReasonElement;
|
||||||
import org.jivesoftware.smackx.jingle.transport.jingle_ibb.JingleIBBTransportManager;
|
import org.jivesoftware.smackx.jingle.transport.jingle_ibb.JingleIBBTransportManager;
|
||||||
import org.jivesoftware.smackx.jingle_filetransfer.controller.IncomingFileOfferController;
|
import org.jivesoftware.smackx.jingle_filetransfer.controller.IncomingFileOfferController;
|
||||||
import org.jivesoftware.smackx.jingle_filetransfer.controller.OutgoingFileOfferController;
|
import org.jivesoftware.smackx.jingle_filetransfer.controller.OutgoingFileOfferController;
|
||||||
|
@ -96,14 +97,11 @@ public class JingleFileTransferIntegrationTest extends AbstractSmackIntegrationT
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void progress(float percent) {
|
public void terminated(JingleReasonElement.Reason reason) {
|
||||||
|
if (reason == JingleReasonElement.Reason.success) {
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void finished() {
|
|
||||||
resultSyncPoint2.signal();
|
resultSyncPoint2.signal();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -114,7 +112,7 @@ public class JingleFileTransferIntegrationTest extends AbstractSmackIntegrationT
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
OutgoingFileOfferController sending = aftm.sendFile(source, bob);
|
final OutgoingFileOfferController sending = aftm.sendFile(source, bob);
|
||||||
|
|
||||||
sending.addProgressListener(new ProgressListener() {
|
sending.addProgressListener(new ProgressListener() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -123,14 +121,11 @@ public class JingleFileTransferIntegrationTest extends AbstractSmackIntegrationT
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void progress(float percent) {
|
public void terminated(JingleReasonElement.Reason reason) {
|
||||||
|
if (reason == JingleReasonElement.Reason.success) {
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void finished() {
|
|
||||||
resultSyncPoint1.signal();
|
resultSyncPoint1.signal();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
resultSyncPoint1.waitForResult(60 * 1000);
|
resultSyncPoint1.waitForResult(60 * 1000);
|
||||||
|
|
|
@ -28,6 +28,7 @@ import java.util.logging.Level;
|
||||||
import org.jivesoftware.smack.SmackException;
|
import org.jivesoftware.smack.SmackException;
|
||||||
import org.jivesoftware.smack.XMPPException;
|
import org.jivesoftware.smack.XMPPException;
|
||||||
import org.jivesoftware.smackx.bytestreams.socks5.Socks5Proxy;
|
import org.jivesoftware.smackx.bytestreams.socks5.Socks5Proxy;
|
||||||
|
import org.jivesoftware.smackx.jingle.element.JingleReasonElement;
|
||||||
import org.jivesoftware.smackx.jingle.transport.jingle_ibb.JingleIBBTransportManager;
|
import org.jivesoftware.smackx.jingle.transport.jingle_ibb.JingleIBBTransportManager;
|
||||||
import org.jivesoftware.smackx.jingle.transport.jingle_s5b.JingleS5BTransportManager;
|
import org.jivesoftware.smackx.jingle.transport.jingle_s5b.JingleS5BTransportManager;
|
||||||
import org.jivesoftware.smackx.jingle_filetransfer.controller.IncomingFileOfferController;
|
import org.jivesoftware.smackx.jingle_filetransfer.controller.IncomingFileOfferController;
|
||||||
|
@ -105,14 +106,11 @@ public class JingleFileTransferTransportFallbackIntegrationTest extends Abstract
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void progress(float percent) {
|
public void terminated(JingleReasonElement.Reason reason) {
|
||||||
|
if (reason == JingleReasonElement.Reason.success) {
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void finished() {
|
|
||||||
resultSyncPoint2.signal();
|
resultSyncPoint2.signal();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -123,7 +121,7 @@ public class JingleFileTransferTransportFallbackIntegrationTest extends Abstract
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
OutgoingFileOfferController sending = aftm.sendFile(source, bob);
|
final OutgoingFileOfferController sending = aftm.sendFile(source, bob);
|
||||||
|
|
||||||
sending.addProgressListener(new ProgressListener() {
|
sending.addProgressListener(new ProgressListener() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -132,14 +130,11 @@ public class JingleFileTransferTransportFallbackIntegrationTest extends Abstract
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void progress(float percent) {
|
public void terminated(JingleReasonElement.Reason reason) {
|
||||||
|
if (reason == JingleReasonElement.Reason.success) {
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void finished() {
|
|
||||||
resultSyncPoint1.signal();
|
resultSyncPoint1.signal();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
resultSyncPoint1.waitForResult(60 * 1000);
|
resultSyncPoint1.waitForResult(60 * 1000);
|
||||||
|
|
Loading…
Reference in a new issue