From 7309c6f3ac4e580f197b4835d05bb011fa90780b Mon Sep 17 00:00:00 2001 From: fiaxh Date: Wed, 15 Jul 2020 15:08:56 +0200 Subject: Visually highlight pending messages, improve resending --- xmpp-vala/src/core/xmpp_stream.vala | 2 +- xmpp-vala/src/module/xep/0198_stream_management.vala | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) (limited to 'xmpp-vala') diff --git a/xmpp-vala/src/core/xmpp_stream.vala b/xmpp-vala/src/core/xmpp_stream.vala index f4cdf09a..7e7588b1 100644 --- a/xmpp-vala/src/core/xmpp_stream.vala +++ b/xmpp-vala/src/core/xmpp_stream.vala @@ -410,7 +410,7 @@ public class StartTlsConnectionProvider : ConnectionProvider { } public interface WriteNodeFunc : Object { - public abstract async void write_stanza(XmppStream stream, StanzaNode node) throws IOError; + public abstract async void write_stanza(XmppStream stream, StanzaNode node) throws IOStreamError; } } diff --git a/xmpp-vala/src/module/xep/0198_stream_management.vala b/xmpp-vala/src/module/xep/0198_stream_management.vala index c44e2c70..bc695ddb 100644 --- a/xmpp-vala/src/module/xep/0198_stream_management.vala +++ b/xmpp-vala/src/module/xep/0198_stream_management.vala @@ -25,14 +25,18 @@ public class Module : XmppStreamNegotiationModule, WriteNodeFunc { } } - public async void write_stanza(XmppStream stream, StanzaNode node) throws IOError { + public async void write_stanza(XmppStream stream, StanzaNode node) throws IOStreamError { if (stream.has_flag(Flag.IDENTITY)) { var promise = new Promise(); node_queue.add(new QueueItem(node, promise)); check_queue(stream); - yield promise.future.wait_async(); + try { + yield promise.future.wait_async(); + } catch (FutureError e) { + throw new IOStreamError.WRITE("Future returned error %i".printf(e.code)); + } } else { yield write_node(stream, node); } @@ -141,10 +145,11 @@ public class Module : XmppStreamNegotiationModule, WriteNodeFunc { flags = stream.flags; stream.write_obj = this; } else if (node.name == "resumed") { + stream.get_flag(Flag.IDENTITY).resumed = true; + foreach (XmppStreamFlag flag in flags) { stream.add_flag(flag); } - stream.negotiation_complete = true; h_outbound = int.parse(node.get_attribute("h", NS_URI)); handle_incoming_h(stream, h_outbound); @@ -158,7 +163,7 @@ public class Module : XmppStreamNegotiationModule, WriteNodeFunc { stream.received_features_node(stream); session_id = null; foreach (var id in in_flight_stanzas.keys) { - in_flight_stanzas[id].promise.set_exception(new IOError.FAILED("bla")); + in_flight_stanzas[id].promise.set_exception(new IOStreamError.WRITE("Stanza not acked and session not resumed")); } in_flight_stanzas.clear(); check_queue(stream); @@ -200,6 +205,7 @@ public class Module : XmppStreamNegotiationModule, WriteNodeFunc { public class Flag : XmppStreamFlag { public static FlagIdentity IDENTITY = new FlagIdentity(NS_URI, "stream_management"); public bool finished = false; + public bool resumed = false; public override string get_ns() { return NS_URI; } public override string get_id() { return IDENTITY.id; } -- cgit v1.2.3-70-g09d2