jingle ibb: wait to receive ibb
previously we signalled succesfull file reception after receiving enough bytes on ibb; however that causes us to race with the session-info file hash. now the recipient will wait for <close/> and the sender will make sure to send the session-info before sending close. closes #3500
This commit is contained in:
parent
1cf7a2b832
commit
8263fb73e9
|
@ -15,7 +15,6 @@ import eu.siacs.conversations.entities.Account;
|
||||||
import eu.siacs.conversations.entities.DownloadableFile;
|
import eu.siacs.conversations.entities.DownloadableFile;
|
||||||
import eu.siacs.conversations.persistance.FileBackend;
|
import eu.siacs.conversations.persistance.FileBackend;
|
||||||
import eu.siacs.conversations.services.AbstractConnectionManager;
|
import eu.siacs.conversations.services.AbstractConnectionManager;
|
||||||
import eu.siacs.conversations.utils.CryptoHelper;
|
|
||||||
import eu.siacs.conversations.xml.Element;
|
import eu.siacs.conversations.xml.Element;
|
||||||
import eu.siacs.conversations.xmpp.OnIqPacketReceived;
|
import eu.siacs.conversations.xmpp.OnIqPacketReceived;
|
||||||
import eu.siacs.conversations.xmpp.stanzas.IqPacket;
|
import eu.siacs.conversations.xmpp.stanzas.IqPacket;
|
||||||
|
@ -70,6 +69,7 @@ public class JingleInbandTransport extends JingleTransport {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendClose() {
|
private void sendClose() {
|
||||||
|
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": sending ibb close");
|
||||||
IqPacket iq = new IqPacket(IqPacket.TYPE.SET);
|
IqPacket iq = new IqPacket(IqPacket.TYPE.SET);
|
||||||
iq.setTo(this.counterpart);
|
iq.setTo(this.counterpart);
|
||||||
Element close = iq.addChild("close", "http://jabber.org/protocol/ibb");
|
Element close = iq.addChild("close", "http://jabber.org/protocol/ibb");
|
||||||
|
@ -178,9 +178,9 @@ public class JingleInbandTransport extends JingleTransport {
|
||||||
this.seq++;
|
this.seq++;
|
||||||
connection.updateProgress((int) ((((double) (this.fileSize - this.remainingSize)) / this.fileSize) * 100));
|
connection.updateProgress((int) ((((double) (this.fileSize - this.remainingSize)) / this.fileSize) * 100));
|
||||||
if (this.remainingSize <= 0) {
|
if (this.remainingSize <= 0) {
|
||||||
sendClose();
|
|
||||||
file.setSha1Sum(digest.digest());
|
file.setSha1Sum(digest.digest());
|
||||||
this.onFileTransmissionStatusChanged.onFileTransmitted(file);
|
this.onFileTransmissionStatusChanged.onFileTransmitted(file);
|
||||||
|
sendClose();
|
||||||
fileInputStream.close();
|
fileInputStream.close();
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
@ -200,11 +200,7 @@ public class JingleInbandTransport extends JingleTransport {
|
||||||
this.fileOutputStream.write(buffer);
|
this.fileOutputStream.write(buffer);
|
||||||
this.digest.update(buffer);
|
this.digest.update(buffer);
|
||||||
if (this.remainingSize <= 0) {
|
if (this.remainingSize <= 0) {
|
||||||
file.setSha1Sum(digest.digest());
|
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": received last block. waiting for close");
|
||||||
fileOutputStream.flush();
|
|
||||||
fileOutputStream.close();
|
|
||||||
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": receive next block nothing remaining");
|
|
||||||
this.onFileTransmissionStatusChanged.onFileTransmitted(file);
|
|
||||||
} else {
|
} else {
|
||||||
connection.updateProgress((int) ((((double) (this.fileSize - this.remainingSize)) / this.fileSize) * 100));
|
connection.updateProgress((int) ((((double) (this.fileSize - this.remainingSize)) / this.fileSize) * 100));
|
||||||
}
|
}
|
||||||
|
@ -215,6 +211,19 @@ public class JingleInbandTransport extends JingleTransport {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void done() {
|
||||||
|
try {
|
||||||
|
file.setSha1Sum(digest.digest());
|
||||||
|
fileOutputStream.flush();
|
||||||
|
fileOutputStream.close();
|
||||||
|
this.onFileTransmissionStatusChanged.onFileTransmitted(file);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": " + e.getMessage());
|
||||||
|
FileBackend.close(fileOutputStream);
|
||||||
|
this.onFileTransmissionStatusChanged.onFileTransferAborted();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void deliverPayload(IqPacket packet, Element payload) {
|
public void deliverPayload(IqPacket packet, Element payload) {
|
||||||
if (payload.getName().equals("open")) {
|
if (payload.getName().equals("open")) {
|
||||||
if (!established) {
|
if (!established) {
|
||||||
|
@ -235,10 +244,16 @@ public class JingleInbandTransport extends JingleTransport {
|
||||||
this.connected = false;
|
this.connected = false;
|
||||||
this.account.getXmppConnection().sendIqPacket(
|
this.account.getXmppConnection().sendIqPacket(
|
||||||
packet.generateResponse(IqPacket.TYPE.RESULT), null);
|
packet.generateResponse(IqPacket.TYPE.RESULT), null);
|
||||||
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": received ibb close");
|
if (this.remainingSize <= 0) {
|
||||||
|
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": received ibb close. done");
|
||||||
|
done();
|
||||||
} else {
|
} else {
|
||||||
Log.d(Config.LOGTAG, payload.toString());
|
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": received ibb close with " + this.remainingSize + " remaining");
|
||||||
// TODO some sort of exception
|
FileBackend.close(fileOutputStream);
|
||||||
|
this.onFileTransmissionStatusChanged.onFileTransferAborted();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.account.getXmppConnection().sendIqPacket(packet.generateResponse(IqPacket.TYPE.ERROR), null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue