Adjust JMI vs direct calling order

This commit is contained in:
fiaxh 2021-04-29 15:29:41 +02:00
parent 4c6664a365
commit 6b976cdb66

View file

@ -83,7 +83,19 @@ namespace Dino {
we_should_send_video[call] = video; we_should_send_video[call] = video;
we_should_send_audio[call] = true; we_should_send_audio[call] = true;
if (has_jmi_resources(conversation)) { Gee.List<Jid> call_resources = yield get_call_resources(conversation);
bool do_jmi = false;
Jid? jid_for_direct = null;
if (yield contains_jmi_resources(conversation.account, call_resources)) {
do_jmi = true;
} else if (!call_resources.is_empty) {
jid_for_direct = call_resources[0];
} else if (has_jmi_resources(conversation)) {
do_jmi = true;
}
if (do_jmi) {
XmppStream? stream = stream_interactor.get_stream(conversation.account); XmppStream? stream = stream_interactor.get_stream(conversation.account);
jmi_call[conversation.account] = call; jmi_call[conversation.account] = call;
jmi_video[conversation.account] = video; jmi_video[conversation.account] = video;
@ -92,19 +104,14 @@ namespace Dino {
call_by_sid[call.account][jmi_sid[conversation.account]] = call; call_by_sid[call.account][jmi_sid[conversation.account]] = call;
var descriptions = new ArrayList<StanzaNode>(); var descriptions = new ArrayList<StanzaNode>();
descriptions.add(new StanzaNode.build("description", "urn:xmpp:jingle:apps:rtp:1").add_self_xmlns().put_attribute("media", "audio")); descriptions.add(new StanzaNode.build("description", Xep.JingleRtp.NS_URI).add_self_xmlns().put_attribute("media", "audio"));
if (video) { if (video) {
descriptions.add(new StanzaNode.build("description", "urn:xmpp:jingle:apps:rtp:1").add_self_xmlns().put_attribute("media", "video")); descriptions.add(new StanzaNode.build("description", Xep.JingleRtp.NS_URI).add_self_xmlns().put_attribute("media", "video"));
} }
stream.get_module(Xmpp.Xep.JingleMessageInitiation.Module.IDENTITY).send_session_propose_to_peer(stream, conversation.counterpart, jmi_sid[call.account], descriptions); stream.get_module(Xmpp.Xep.JingleMessageInitiation.Module.IDENTITY).send_session_propose_to_peer(stream, conversation.counterpart, jmi_sid[call.account], descriptions);
} else { } else if (jid_for_direct != null) {
Gee.List<Jid> call_resources = yield get_call_resources(conversation); yield call_resource(conversation.account, jid_for_direct, call, video);
if (call_resources.size == 0) {
warning("No call resources");
return null;
}
yield call_resource(conversation.account, call_resources[0], call, video);
} }
conversation.last_active = call.time; conversation.last_active = call.time;
@ -286,6 +293,17 @@ namespace Dino {
return ret; return ret;
} }
private async bool contains_jmi_resources(Account account, Gee.List<Jid> full_jids) {
XmppStream? stream = stream_interactor.get_stream(account);
if (stream == null) return false;
foreach (Jid full_jid in full_jids) {
bool does_jmi = yield stream_interactor.get_module(EntityInfo.IDENTITY).has_feature(account, full_jid, Xep.JingleMessageInitiation.NS_URI);
if (does_jmi) return true;
}
return false;
}
private bool has_jmi_resources(Conversation conversation) { private bool has_jmi_resources(Conversation conversation) {
int64 jmi_resources = db.entity.select() int64 jmi_resources = db.entity.select()
.with(db.entity.jid_id, "=", db.get_jid_id(conversation.counterpart)) .with(db.entity.jid_id, "=", db.get_jid_id(conversation.counterpart))