fix Jingle FT candidate selection for equal priority. fixes #3771
This commit is contained in:
parent
c029382410
commit
b78d45c7cc
|
@ -147,7 +147,6 @@ public class JingleCandidate {
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return this.getHost() + ":" + this.getPort() + " (prio="
|
return String.format("%s:%s (priority=%s,ours=%s)", getHost(), getPort(), getPriority(), isOurs());
|
||||||
+ this.getPriority() + ")";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,8 @@ import android.util.Log;
|
||||||
|
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
import com.google.common.collect.Collections2;
|
import com.google.common.collect.Collections2;
|
||||||
|
import com.google.common.collect.FluentIterable;
|
||||||
|
import com.google.common.collect.Iterables;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
|
@ -442,7 +444,7 @@ public class JingleFileTransferConnection extends AbstractJingleConnection imple
|
||||||
try {
|
try {
|
||||||
senders = content.getSenders();
|
senders = content.getSenders();
|
||||||
} catch (final Exception e) {
|
} catch (final Exception e) {
|
||||||
senders = Content.Senders.INITIATOR;
|
senders = Content.Senders.INITIATOR;
|
||||||
}
|
}
|
||||||
this.contentSenders = senders;
|
this.contentSenders = senders;
|
||||||
this.contentName = content.getAttribute("name");
|
this.contentName = content.getAttribute("name");
|
||||||
|
@ -825,8 +827,9 @@ public class JingleFileTransferConnection extends AbstractJingleConnection imple
|
||||||
this.sendFallbackToIbb();
|
this.sendFallbackToIbb();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
//TODO at this point we can already close other connections to free some resources
|
||||||
final JingleCandidate candidate = connection.getCandidate();
|
final JingleCandidate candidate = connection.getCandidate();
|
||||||
Log.d(Config.LOGTAG, id.account.getJid().asBareJid() + ": elected candidate " + candidate.getHost() + ":" + candidate.getPort());
|
Log.d(Config.LOGTAG, id.account.getJid().asBareJid() + ": elected candidate " + candidate.toString());
|
||||||
this.mJingleStatus = JINGLE_STATUS_TRANSMITTING;
|
this.mJingleStatus = JINGLE_STATUS_TRANSMITTING;
|
||||||
if (connection.needsActivation()) {
|
if (connection.needsActivation()) {
|
||||||
if (connection.getCandidate().isOurs()) {
|
if (connection.getCandidate().isOurs()) {
|
||||||
|
@ -875,38 +878,23 @@ public class JingleFileTransferConnection extends AbstractJingleConnection imple
|
||||||
}
|
}
|
||||||
|
|
||||||
private JingleSocks5Transport chooseConnection() {
|
private JingleSocks5Transport chooseConnection() {
|
||||||
JingleSocks5Transport connection = null;
|
final List<JingleSocks5Transport> establishedConnections = FluentIterable.from(connections.entrySet())
|
||||||
for (Entry<String, JingleSocks5Transport> cursor : connections
|
.transform(Entry::getValue)
|
||||||
.entrySet()) {
|
.filter(c -> (c != null && c.isEstablished() && (c.getCandidate().isUsedByCounterpart() || !c.getCandidate().isOurs())))
|
||||||
JingleSocks5Transport currentConnection = cursor.getValue();
|
.toSortedList((a, b) -> {
|
||||||
// Log.d(Config.LOGTAG,"comparing candidate: "+currentConnection.getCandidate().toString());
|
final int compare = Integer.compare(b.getCandidate().getPriority(), a.getCandidate().getPriority());
|
||||||
if (currentConnection.isEstablished()
|
if (compare == 0) {
|
||||||
&& (currentConnection.getCandidate().isUsedByCounterpart() || (!currentConnection
|
|
||||||
.getCandidate().isOurs()))) {
|
|
||||||
// Log.d(Config.LOGTAG,"is usable");
|
|
||||||
if (connection == null) {
|
|
||||||
connection = currentConnection;
|
|
||||||
} else {
|
|
||||||
if (connection.getCandidate().getPriority() < currentConnection
|
|
||||||
.getCandidate().getPriority()) {
|
|
||||||
connection = currentConnection;
|
|
||||||
} else if (connection.getCandidate().getPriority() == currentConnection
|
|
||||||
.getCandidate().getPriority()) {
|
|
||||||
// Log.d(Config.LOGTAG,"found two candidates with same priority");
|
|
||||||
if (isInitiator()) {
|
if (isInitiator()) {
|
||||||
if (currentConnection.getCandidate().isOurs()) {
|
//pick the one we sent a candidate-used for (meaning not ours)
|
||||||
connection = currentConnection;
|
return a.getCandidate().isOurs() ? 1 : -1;
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if (!currentConnection.getCandidate().isOurs()) {
|
//pick the one they sent a candidate-used for (meaning ours)
|
||||||
connection = currentConnection;
|
return a.getCandidate().isOurs() ? -1 : 1;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
return compare;
|
||||||
}
|
});
|
||||||
}
|
return Iterables.getFirst(establishedConnections, null);
|
||||||
return connection;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendSuccess() {
|
private void sendSuccess() {
|
||||||
|
|
Loading…
Reference in a new issue