diff options
author | Alex Clayton <alex.clayton@isode.com> | 2016-03-16 15:45:11 (GMT) |
---|---|---|
committer | Alex Clayton <alex.clayton@isode.com> | 2016-03-16 15:57:40 (GMT) |
commit | f693c8e0fa9c6a051cdf6260f131db3d9355b49f (patch) | |
tree | 10ca50f0c3494566e005f9c202f7d3b6c6d036f9 /src/com/isode/stroke/filetransfer/OutgoingJingleFileTransfer.java | |
parent | 8b9891afc85d114ff1e9c9a0291a4aaee8baeb09 (diff) | |
download | stroke-f693c8e0fa9c6a051cdf6260f131db3d9355b49f.zip stroke-f693c8e0fa9c6a051cdf6260f131db3d9355b49f.tar.bz2 |
Support early IBB use in Jingle File Transfer
As per swiften patch of the same name
(75703db2de5bbfb6622286600362016edb42dfb0).
Previously Jingle File Transfer in Stroke only used IBB transport as
fallback mechanism. With this patch Stroke will use IBB transport
candidates directly in the first session-initate/session-accept
message if the other party only supports IBB.
Test-information: Unit tests all pass.
Change-Id: Ice73a6028f10c63490bdb775a0a407fad48f587a
Diffstat (limited to 'src/com/isode/stroke/filetransfer/OutgoingJingleFileTransfer.java')
-rw-r--r-- | src/com/isode/stroke/filetransfer/OutgoingJingleFileTransfer.java | 51 |
1 files changed, 39 insertions, 12 deletions
diff --git a/src/com/isode/stroke/filetransfer/OutgoingJingleFileTransfer.java b/src/com/isode/stroke/filetransfer/OutgoingJingleFileTransfer.java index aa38022..e2117b6 100644 --- a/src/com/isode/stroke/filetransfer/OutgoingJingleFileTransfer.java +++ b/src/com/isode/stroke/filetransfer/OutgoingJingleFileTransfer.java @@ -179,10 +179,19 @@ public class OutgoingJingleFileTransfer extends JingleFileTransfer implements Ou logger_.warning("Incorrect state\n"); return; } - - setTransporter(transporterFactory.createInitiatorTransporter(getInitiator(), getResponder(), options)); - setInternalState(State.GeneratingInitialLocalCandidates); - transporter.startGeneratingLocalCandidates(); + + if (!options.isInBandAllowed() && !options.isDirectAllowed() + && !options.isAssistedAllowed() && !options.isProxiedAllowed()) { + // Started outgoing file transfer while not supporting transport methods. + setFinishedState(FileTransfer.State.Type.Failed, + new FileTransferError(FileTransferError.Type.UnknownError)); + } + else { + setTransporter(transporterFactory.createInitiatorTransporter(getInitiator(), getResponder(), options)); + setInternalState(State.GeneratingInitialLocalCandidates); + transporter.startGeneratingLocalCandidates(); + } + } /** @@ -217,6 +226,13 @@ public class OutgoingJingleFileTransfer extends JingleFileTransfer implements Ou setInternalState(State.TryingCandidates); transporter.startTryingRemoteCandidates(); } + else if (transportPayload instanceof JingleIBBTransportPayload) { + JingleIBBTransportPayload ibbPayload = (JingleIBBTransportPayload) transportPayload; + int blockSize = ibbPayload.getBlockSize() != null ? + ibbPayload.getBlockSize().intValue() : DEFAULT_BLOCK_SIZE; + startTransferring(transporter.createIBBSendSession(ibbPayload.getSessionID(), + blockSize, stream)); + } else { logger_.fine("Unknown transport payload. Falling back.\n"); fallback(); @@ -310,14 +326,25 @@ public class OutgoingJingleFileTransfer extends JingleFileTransfer implements Ou fileInfo.addHash(new HashElement("md5", new ByteArray())); description.setFileInfo(fileInfo); - JingleS5BTransportPayload transport = new JingleS5BTransportPayload(); - transport.setSessionID(s5bSessionID); - transport.setMode(JingleS5BTransportPayload.Mode.TCPMode); - transport.setDstAddr(dstAddr); - for(JingleS5BTransportPayload.Candidate candidate : candidates) { - transport.addCandidate(candidate); - logger_.fine("\t" + "S5B candidate: " + candidate.hostPort.toString() + "\n"); - } + JingleTransportPayload transport = null; + if (candidates.isEmpty()) { + logger_.fine("no S5B candidate generated. Send IBB transport candidate.\n"); + JingleIBBTransportPayload ibbTransport = new JingleIBBTransportPayload(); + ibbTransport.setBlockSize(DEFAULT_BLOCK_SIZE); + ibbTransport.setSessionID(idGenerator.generateID()); + transport = ibbTransport; + } + else { + JingleS5BTransportPayload s5bTransport = new JingleS5BTransportPayload(); + s5bTransport.setSessionID(s5bSessionID); + s5bTransport.setMode(JingleS5BTransportPayload.Mode.TCPMode); + s5bTransport.setDstAddr(dstAddr); + for (JingleS5BTransportPayload.Candidate candidate : candidates) { + s5bTransport.addCandidate(candidate); + logger_.fine("\tS5B candidate: "+candidate.hostPort +"\n"); + } + transport = s5bTransport; + } setInternalState(State.WaitingForAccept); session.sendInitiate(contentID, description, transport); } |