accept direct ibb jingle offers

This commit is contained in:
Daniel Gultsch 2019-06-16 21:23:18 +02:00
parent 1cfba86aff
commit fe6c981ae2
2 changed files with 59 additions and 15 deletions

View File

@ -2,7 +2,6 @@ package eu.siacs.conversations.xmpp.jingle;
import android.util.Base64; import android.util.Base64;
import android.util.Log; import android.util.Log;
import android.util.Pair;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
@ -74,6 +73,7 @@ public class JingleConnection implements Transferable {
private String contentName; private String contentName;
private String contentCreator; private String contentCreator;
private Transport initialTransport;
private int mProgress = 0; private int mProgress = 0;
@ -167,6 +167,18 @@ public class JingleConnection implements Transferable {
return this.mFileOutputStream; return this.mFileOutputStream;
} }
private OnTransportConnected onIbbTransportConnected = new OnTransportConnected() {
@Override
public void failed() {
Log.d(Config.LOGTAG, "ibb open failed");
}
@Override
public void established() {
JingleConnection.this.transport.send(file, onFileTransmissionStatusChanged);
}
};
private OnProxyActivated onProxyActivated = new OnProxyActivated() { private OnProxyActivated onProxyActivated = new OnProxyActivated() {
@Override @Override
@ -368,9 +380,27 @@ public class JingleConnection implements Transferable {
this.sessionId = packet.getSessionId(); this.sessionId = packet.getSessionId();
Content content = packet.getJingleContent(); Content content = packet.getJingleContent();
this.contentCreator = content.getAttribute("creator"); this.contentCreator = content.getAttribute("creator");
this.initialTransport = content.hasSocks5Transport() ? Transport.SOCKS : Transport.IBB;
this.contentName = content.getAttribute("name"); this.contentName = content.getAttribute("name");
this.transportId = content.getTransportId(); this.transportId = content.getTransportId();
if (this.initialTransport == Transport.SOCKS) {
this.mergeCandidates(JingleCandidate.parse(content.socks5transport().getChildren())); this.mergeCandidates(JingleCandidate.parse(content.socks5transport().getChildren()));
} else if (this.initialTransport == Transport.IBB) {
final String receivedBlockSize = content.ibbTransport().getAttribute("block-size");
if (receivedBlockSize != null) {
try {
this.ibbBlockSize = Math.min(Integer.parseInt(receivedBlockSize), this.ibbBlockSize);
} catch (NumberFormatException e) {
this.sendCancel();
this.fail();
return;
}
} else {
this.sendCancel();
this.fail();
return;
}
}
this.ftVersion = content.getVersion(); this.ftVersion = content.getVersion();
if (ftVersion == null) { if (ftVersion == null) {
this.sendCancel(); this.sendCancel();
@ -532,6 +562,14 @@ public class JingleConnection implements Transferable {
mJingleStatus = JINGLE_STATUS_ACCEPTED; mJingleStatus = JINGLE_STATUS_ACCEPTED;
this.mStatus = Transferable.STATUS_DOWNLOADING; this.mStatus = Transferable.STATUS_DOWNLOADING;
this.mJingleConnectionManager.updateConversationUi(true); this.mJingleConnectionManager.updateConversationUi(true);
if (initialTransport == Transport.SOCKS) {
sendAcceptSocks();
} else {
sendAcceptIbb();
}
}
private void sendAcceptSocks() {
this.mJingleConnectionManager.getPrimaryCandidate(this.account, new OnPrimaryCandidateFound() { this.mJingleConnectionManager.getPrimaryCandidate(this.account, new OnPrimaryCandidateFound() {
@Override @Override
public void onPrimaryCandidateFound(boolean success, final JingleCandidate candidate) { public void onPrimaryCandidateFound(boolean success, final JingleCandidate candidate) {
@ -576,6 +614,17 @@ public class JingleConnection implements Transferable {
}); });
} }
private void sendAcceptIbb() {
this.transport = new JingleInbandTransport(this, this.transportId, this.ibbBlockSize);
final JinglePacket packet = bootstrapPacket("session-accept");
final Content content = new Content(contentCreator,contentName);
content.setFileOffer(fileOffer, ftVersion);
content.setTransportId(transportId);
content.ibbTransport().setAttribute("block-size",this.ibbBlockSize);
packet.setContent(content);
this.sendJinglePacket(packet);
}
private JinglePacket bootstrapPacket(String action) { private JinglePacket bootstrapPacket(String action) {
JinglePacket packet = new JinglePacket(); JinglePacket packet = new JinglePacket();
packet.setAction(action); packet.setAction(action);
@ -785,17 +834,6 @@ public class JingleConnection implements Transferable {
this.sendJinglePacket(packet); this.sendJinglePacket(packet);
} }
OnTransportConnected onIbbTransportConnected = new OnTransportConnected() {
@Override
public void failed() {
Log.d(Config.LOGTAG, "ibb open failed");
}
@Override
public void established() {
JingleConnection.this.transport.send(file, onFileTransmissionStatusChanged);
}
};
private boolean receiveFallbackToIbb(JinglePacket packet) { private boolean receiveFallbackToIbb(JinglePacket packet) {
Log.d(Config.LOGTAG, "receiving fallack to ibb"); Log.d(Config.LOGTAG, "receiving fallack to ibb");
@ -811,8 +849,9 @@ public class JingleConnection implements Transferable {
this.transport = new JingleInbandTransport(this, this.transportId, this.ibbBlockSize); this.transport = new JingleInbandTransport(this, this.transportId, this.ibbBlockSize);
JinglePacket answer = bootstrapPacket("transport-accept"); JinglePacket answer = bootstrapPacket("transport-accept");
Content content = new Content("initiator", "a-file-offer");
content.setTransportId(this.transportId); final Content content = new Content(contentCreator,contentName);
content.setFileOffer(fileOffer, ftVersion);
content.ibbTransport().setAttribute("block-size",this.ibbBlockSize); content.ibbTransport().setAttribute("block-size",this.ibbBlockSize);
answer.setContent(content); answer.setContent(content);

View File

@ -0,0 +1,5 @@
package eu.siacs.conversations.xmpp.jingle;
public enum Transport {
SOCKS, IBB
}