Collapse most stream releated errors into IOError
This commit is contained in:
parent
95fefaff51
commit
18321ed15c
|
@ -459,7 +459,7 @@ public class MessageProcessor : StreamInteractionModule, Object {
|
|||
if (!conversation.type_.is_muc_semantic() && current_own_jid != null && !current_own_jid.equals(message.ourpart)) {
|
||||
message.ourpart = current_own_jid;
|
||||
}
|
||||
} catch (IOStreamError e) {
|
||||
} catch (IOError e) {
|
||||
message.marked = Entities.Message.Marked.UNSENT;
|
||||
|
||||
if (stream != stream_interactor.get_stream(conversation.account)) {
|
||||
|
|
|
@ -37,7 +37,7 @@ public class Dino.Reactions : StreamInteractionModule, Object {
|
|||
try {
|
||||
send_reactions(conversation, content_item, reactions);
|
||||
reaction_added(conversation.account, content_item.id, conversation.account.bare_jid, reaction);
|
||||
} catch (SendError e) {}
|
||||
} catch (IOError e) {}
|
||||
}
|
||||
|
||||
public void remove_reaction(Conversation conversation, ContentItem content_item, string reaction) {
|
||||
|
@ -46,7 +46,7 @@ public class Dino.Reactions : StreamInteractionModule, Object {
|
|||
try {
|
||||
send_reactions(conversation, content_item, reactions);
|
||||
reaction_removed(conversation.account, content_item.id, conversation.account.bare_jid, reaction);
|
||||
} catch (SendError e) {}
|
||||
} catch (IOError e) {}
|
||||
}
|
||||
|
||||
public Gee.List<ReactionUsers> get_item_reactions(Conversation conversation, ContentItem content_item) {
|
||||
|
@ -74,12 +74,12 @@ public class Dino.Reactions : StreamInteractionModule, Object {
|
|||
}
|
||||
}
|
||||
|
||||
private void send_reactions(Conversation conversation, ContentItem content_item, Gee.List<string> reactions) throws SendError {
|
||||
private void send_reactions(Conversation conversation, ContentItem content_item, Gee.List<string> reactions) throws IOError {
|
||||
string? message_id = stream_interactor.get_module(ContentItemStore.IDENTITY).get_message_id_for_content_item(conversation, content_item);
|
||||
if (message_id == null) throw new SendError.Misc("No message for content_item");
|
||||
if (message_id == null) throw new IOError.FAILED("No message for content_item");
|
||||
|
||||
XmppStream? stream = stream_interactor.get_stream(conversation.account);
|
||||
if (stream == null) throw new SendError.NoStream("");
|
||||
if (stream == null) throw new IOError.NOT_CONNECTED("No stream");
|
||||
|
||||
var reactions_module = stream.get_module(Xmpp.Xep.Reactions.Module.IDENTITY);
|
||||
|
||||
|
@ -94,7 +94,7 @@ public class Dino.Reactions : StreamInteractionModule, Object {
|
|||
try {
|
||||
reactions_module.send_reaction.end(res);
|
||||
save_chat_reactions(conversation.account, conversation.account.bare_jid, content_item.id, now_millis, reactions);
|
||||
} catch (SendError e) {}
|
||||
} catch (IOError e) {}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ public class Xmpp.DirectTlsXmppStream : TlsXmppStream {
|
|||
this.on_invalid_cert = on_invalid_cert;
|
||||
}
|
||||
|
||||
public override async void connect() throws IOStreamError {
|
||||
public override async void connect() throws IOError {
|
||||
SocketClient client = new SocketClient();
|
||||
try {
|
||||
debug("Connecting to %s:%i (tls)", host, port);
|
||||
|
@ -29,8 +29,10 @@ public class Xmpp.DirectTlsXmppStream : TlsXmppStream {
|
|||
yield setup();
|
||||
|
||||
attach_negotation_modules();
|
||||
} catch (IOError e) {
|
||||
throw e;
|
||||
} catch (Error e) {
|
||||
throw new IOStreamError.CONNECT("Failed connecting to %s:%i (tls): %s", host, port, e.message);
|
||||
throw new IOError.CONNECTION_REFUSED("Failed connecting to %s:%i (tls): %s", host, port, e.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
using Gee;
|
||||
|
||||
public interface Xmpp.WriteNodeFunc : Object {
|
||||
public abstract async void write_stanza(XmppStream stream, StanzaNode node) throws IOStreamError;
|
||||
public abstract async void write_stanza(XmppStream stream, StanzaNode node) throws IOError;
|
||||
}
|
||||
|
||||
public abstract class Xmpp.IoXmppStream : XmppStream {
|
||||
|
@ -15,10 +15,10 @@ public abstract class Xmpp.IoXmppStream : XmppStream {
|
|||
base(remote_name);
|
||||
}
|
||||
|
||||
public override async void disconnect() throws IOStreamError, XmlError, IOError {
|
||||
public override async void disconnect() throws IOError {
|
||||
disconnected = true;
|
||||
if (writer == null || reader == null || stream == null) {
|
||||
throw new IOStreamError.DISCONNECT("trying to disconnect, but no stream open");
|
||||
throw new IOError.CLOSED("trying to disconnect, but no stream open");
|
||||
}
|
||||
log.str("OUT", "</stream:stream>", this);
|
||||
yield writer.write("</stream:stream>");
|
||||
|
@ -35,16 +35,12 @@ public abstract class Xmpp.IoXmppStream : XmppStream {
|
|||
require_setup();
|
||||
}
|
||||
|
||||
public override async StanzaNode read() throws IOStreamError {
|
||||
public override async StanzaNode read() throws IOError {
|
||||
StanzaReader? reader = this.reader;
|
||||
if (reader == null) throw new IOStreamError.READ("trying to read, but no stream open");
|
||||
try {
|
||||
if (reader == null) throw new IOError.NOT_CONNECTED("trying to read, but no stream open");
|
||||
StanzaNode node = yield ((!)reader).read_node();
|
||||
log.node("IN", node, this);
|
||||
return node;
|
||||
} catch (XmlError e) {
|
||||
throw new IOStreamError.READ(e.message);
|
||||
}
|
||||
}
|
||||
|
||||
[Version (deprecated = true, deprecated_since = "0.1", replacement = "write_async")]
|
||||
|
@ -56,18 +52,14 @@ public abstract class Xmpp.IoXmppStream : XmppStream {
|
|||
});
|
||||
}
|
||||
|
||||
public override async void write_async(StanzaNode node) throws IOStreamError {
|
||||
public override async void write_async(StanzaNode node) throws IOError {
|
||||
if (write_obj != null) {
|
||||
yield write_obj.write_stanza(this, node);
|
||||
} else {
|
||||
StanzaWriter? writer = this.writer;
|
||||
if (writer == null) throw new IOStreamError.WRITE("trying to write, but no stream open");
|
||||
try {
|
||||
if (writer == null) throw new IOError.NOT_CONNECTED("trying to write, but no stream open");
|
||||
log.node("OUT", node, this);
|
||||
yield ((!)writer).write_node(node);
|
||||
} catch (XmlError e) {
|
||||
throw new IOStreamError.WRITE(e.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -75,7 +67,7 @@ public abstract class Xmpp.IoXmppStream : XmppStream {
|
|||
return stream;
|
||||
}
|
||||
|
||||
public override async void setup() throws IOStreamError {
|
||||
public override async void setup() throws IOError {
|
||||
StanzaNode outs = new StanzaNode.build("stream", "http://etherx.jabber.org/streams")
|
||||
.put_attribute("to", remote_name.to_string())
|
||||
.put_attribute("version", "1.0")
|
||||
|
@ -89,17 +81,11 @@ public abstract class Xmpp.IoXmppStream : XmppStream {
|
|||
setup_needed = false;
|
||||
}
|
||||
|
||||
private async StanzaNode read_root() throws IOStreamError {
|
||||
private async StanzaNode read_root() throws IOError {
|
||||
StanzaReader? reader = this.reader;
|
||||
if (reader == null) throw new IOStreamError.READ("trying to read, but no stream open");
|
||||
try {
|
||||
if (reader == null) throw new IOError.NOT_CONNECTED("trying to read, but no stream open");
|
||||
StanzaNode node = yield ((!)reader).read_root_node();
|
||||
log.node("IN ROOT", node, this);
|
||||
return node;
|
||||
} catch (XmlError.TLS e) {
|
||||
throw new IOStreamError.TLS(e.message);
|
||||
} catch (Error e) {
|
||||
throw new IOStreamError.READ(e.message);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -52,18 +52,18 @@ public class NamespaceState {
|
|||
this.current_ns_uri = current_ns_uri;
|
||||
}
|
||||
|
||||
public string find_name(string ns_uri) throws XmlError {
|
||||
public string find_name(string ns_uri) throws IOError {
|
||||
if (uri_to_name.has_key(ns_uri)) {
|
||||
return uri_to_name[ns_uri];
|
||||
}
|
||||
throw new XmlError.NS_DICT_ERROR(@"NS URI $ns_uri not found.");
|
||||
throw new IOError.INVALID_DATA(@"XML: NS URI $ns_uri not found.");
|
||||
}
|
||||
|
||||
public string find_uri(string name) throws XmlError {
|
||||
public string find_uri(string name) throws IOError {
|
||||
if (name_to_uri.has_key(name)) {
|
||||
return name_to_uri[name];
|
||||
}
|
||||
throw new XmlError.NS_DICT_ERROR(@"NS name $name not found.");
|
||||
throw new IOError.INVALID_DATA(@"XML: NS name $name not found.");
|
||||
}
|
||||
|
||||
public NamespaceState push() {
|
||||
|
|
|
@ -51,7 +51,7 @@ public class StanzaAttribute : StanzaEntry {
|
|||
}
|
||||
}
|
||||
|
||||
public string to_xml(NamespaceState? state_ = null) throws XmlError {
|
||||
public string to_xml(NamespaceState? state_ = null) {
|
||||
NamespaceState state = state_ ?? new NamespaceState();
|
||||
if (ns_uri == state.current_ns_uri || (ns_uri == XMLNS_URI && name == "xmlns")) {
|
||||
return printf(ATTRIBUTE_XML_NO_NS_FORMAT, true);
|
||||
|
@ -60,7 +60,7 @@ public class StanzaAttribute : StanzaEntry {
|
|||
}
|
||||
}
|
||||
|
||||
public string to_ansi_xml(NamespaceState? state_ = null) throws XmlError {
|
||||
public string to_ansi_xml(NamespaceState? state_ = null) {
|
||||
NamespaceState state = state_ ?? new NamespaceState();
|
||||
if (ns_uri == state.current_ns_uri || (ns_uri == XMLNS_URI && name == "xmlns")) {
|
||||
return printf(ATTRIBUTE_XML_ANSI_NO_NS_FORMAT, true);
|
||||
|
|
|
@ -377,7 +377,7 @@ public class StanzaNode : StanzaEntry {
|
|||
}
|
||||
}
|
||||
|
||||
public string to_xml(NamespaceState? state = null) throws XmlError {
|
||||
public string to_xml(NamespaceState? state = null) throws IOError {
|
||||
NamespaceState my_state = state ?? new NamespaceState.for_stanza();
|
||||
if (name == "#text") return val == null ? "" : (!)encoded_val;
|
||||
my_state = my_state.push();
|
||||
|
|
|
@ -6,15 +6,6 @@ public const string XMLNS_URI = "http://www.w3.org/2000/xmlns/";
|
|||
public const string XML_URI = "http://www.w3.org/XML/1998/namespace";
|
||||
public const string JABBER_URI = "jabber:client";
|
||||
|
||||
public errordomain XmlError {
|
||||
NS_DICT_ERROR,
|
||||
UNSUPPORTED,
|
||||
EOF,
|
||||
BAD_XML,
|
||||
IO,
|
||||
TLS
|
||||
}
|
||||
|
||||
public class StanzaReader {
|
||||
private static int BUFFER_MAX = 4096;
|
||||
|
||||
|
@ -44,27 +35,23 @@ public class StanzaReader {
|
|||
cancellable.cancel();
|
||||
}
|
||||
|
||||
private async void update_buffer() throws XmlError {
|
||||
try {
|
||||
private async void update_buffer() throws IOError {
|
||||
InputStream? input = this.input;
|
||||
if (input == null) throw new XmlError.EOF("No input stream specified and end of buffer reached.");
|
||||
if (cancellable.is_cancelled()) throw new XmlError.EOF("Input stream is canceled.");
|
||||
if (input == null) throw new IOError.CLOSED("No input stream specified and end of buffer reached.");
|
||||
if (cancellable.is_cancelled()) throw new IOError.CANCELLED("Input stream is canceled.");
|
||||
buffer_fill = (int) yield ((!)input).read_async(buffer, GLib.Priority.DEFAULT, cancellable);
|
||||
if (buffer_fill == 0) throw new XmlError.EOF("End of input stream reached.");
|
||||
if (buffer_fill == 0) throw new IOError.CLOSED("End of input stream reached.");
|
||||
buffer_pos = 0;
|
||||
} catch (GLib.IOError e) {
|
||||
throw new XmlError.IO("GLib.IOError: %s".printf(e.message));
|
||||
}
|
||||
}
|
||||
|
||||
private async char read_single() throws XmlError {
|
||||
private async char read_single() throws IOError {
|
||||
if (buffer_pos >= buffer_fill) {
|
||||
yield update_buffer();
|
||||
}
|
||||
return (char) buffer[buffer_pos++];
|
||||
}
|
||||
|
||||
private async char peek_single() throws XmlError {
|
||||
private async char peek_single() throws IOError {
|
||||
if (buffer_pos >= buffer_fill) {
|
||||
yield update_buffer();
|
||||
}
|
||||
|
@ -79,7 +66,7 @@ public class StanzaReader {
|
|||
buffer_pos++;
|
||||
}
|
||||
|
||||
private async void skip_until_non_ws() throws XmlError {
|
||||
private async void skip_until_non_ws() throws IOError {
|
||||
if (buffer_pos >= buffer_fill) {
|
||||
yield update_buffer();
|
||||
}
|
||||
|
@ -91,7 +78,7 @@ public class StanzaReader {
|
|||
}
|
||||
}
|
||||
|
||||
private async string read_until_ws() throws XmlError {
|
||||
private async string read_until_ws() throws IOError {
|
||||
var res = new StringBuilder();
|
||||
if (buffer_pos >= buffer_fill) {
|
||||
yield update_buffer();
|
||||
|
@ -105,7 +92,7 @@ public class StanzaReader {
|
|||
return res.str;
|
||||
}
|
||||
|
||||
private async string read_until_char_or_ws(char x, char y = 0) throws XmlError {
|
||||
private async string read_until_char_or_ws(char x, char y = 0) throws IOError {
|
||||
var res = new StringBuilder();
|
||||
if (buffer_pos >= buffer_fill) {
|
||||
yield update_buffer();
|
||||
|
@ -119,7 +106,7 @@ public class StanzaReader {
|
|||
return res.str;
|
||||
}
|
||||
|
||||
private async string read_until_char(char x) throws XmlError {
|
||||
private async string read_until_char(char x) throws IOError {
|
||||
var res = new StringBuilder();
|
||||
if (buffer_pos >= buffer_fill) {
|
||||
yield update_buffer();
|
||||
|
@ -133,7 +120,7 @@ public class StanzaReader {
|
|||
return res.str;
|
||||
}
|
||||
|
||||
private async StanzaAttribute read_attribute() throws XmlError {
|
||||
private async StanzaAttribute read_attribute() throws IOError {
|
||||
var res = new StanzaAttribute();
|
||||
res.name = yield read_until_char_or_ws('=');
|
||||
if ((yield read_single()) == '=') {
|
||||
|
@ -149,7 +136,7 @@ public class StanzaReader {
|
|||
return res;
|
||||
}
|
||||
|
||||
private void handle_entry_ns(StanzaEntry entry, string default_uri = ns_state.current_ns_uri) throws XmlError {
|
||||
private void handle_entry_ns(StanzaEntry entry, string default_uri = ns_state.current_ns_uri) throws IOError {
|
||||
if (entry.ns_uri != null) return;
|
||||
if (entry.name.contains(":")) {
|
||||
var split = entry.name.split(":");
|
||||
|
@ -160,7 +147,7 @@ public class StanzaReader {
|
|||
}
|
||||
}
|
||||
|
||||
private void handle_stanza_ns(StanzaNode res) throws XmlError {
|
||||
private void handle_stanza_ns(StanzaNode res) throws IOError {
|
||||
foreach (StanzaAttribute attr in res.attributes) {
|
||||
if (attr.name == "xmlns" && attr.val != null) {
|
||||
attr.ns_uri = XMLNS_URI;
|
||||
|
@ -180,7 +167,7 @@ public class StanzaReader {
|
|||
}
|
||||
}
|
||||
|
||||
public async StanzaNode read_node_start() throws XmlError {
|
||||
public async StanzaNode read_node_start() throws IOError {
|
||||
var res = new StanzaNode();
|
||||
res.attributes = new ArrayList<StanzaAttribute>();
|
||||
var eof = false;
|
||||
|
@ -217,7 +204,7 @@ public class StanzaReader {
|
|||
return res;
|
||||
}
|
||||
|
||||
public async StanzaNode read_text_node() throws XmlError {
|
||||
public async StanzaNode read_text_node() throws IOError {
|
||||
var res = new StanzaNode();
|
||||
res.name = "#text";
|
||||
res.ns_uri = ns_state.current_ns_uri;
|
||||
|
@ -225,7 +212,7 @@ public class StanzaReader {
|
|||
return res;
|
||||
}
|
||||
|
||||
public async StanzaNode read_root_node() throws XmlError {
|
||||
public async StanzaNode read_root_node() throws IOError {
|
||||
yield skip_until_non_ws();
|
||||
if ((yield peek_single()) == '<') {
|
||||
var res = yield read_node_start();
|
||||
|
@ -234,11 +221,11 @@ public class StanzaReader {
|
|||
}
|
||||
return res;
|
||||
} else {
|
||||
throw new XmlError.BAD_XML("Content before root node");
|
||||
throw new IOError.INVALID_DATA("XML: Content before root node");
|
||||
}
|
||||
}
|
||||
|
||||
public async StanzaNode read_stanza_node() throws XmlError {
|
||||
public async StanzaNode read_stanza_node() throws IOError {
|
||||
try {
|
||||
ns_state = ns_state.push();
|
||||
var res = yield read_node_start();
|
||||
|
@ -255,11 +242,11 @@ public class StanzaReader {
|
|||
skip_single();
|
||||
if (desc.contains(":")) {
|
||||
var split = desc.split(":");
|
||||
if (split[0] != ns_state.find_name((!)res.ns_uri)) throw new XmlError.BAD_XML("");
|
||||
if (split[1] != res.name) throw new XmlError.BAD_XML("");
|
||||
if (split[0] != ns_state.find_name((!)res.ns_uri)) throw new IOError.INVALID_DATA("XML: Closing namespace prefix mismatch");
|
||||
if (split[1] != res.name) throw new IOError.INVALID_DATA("XML: Closing element name mismatch");
|
||||
} else {
|
||||
if (ns_state.current_ns_uri != res.ns_uri) throw new XmlError.BAD_XML("");
|
||||
if (desc != res.name) throw new XmlError.BAD_XML("");
|
||||
if (ns_state.current_ns_uri != res.ns_uri) throw new IOError.INVALID_DATA("XML: Closing element namespace mismatch");
|
||||
if (desc != res.name) throw new IOError.INVALID_DATA("XML: Closing element name mismatch");
|
||||
}
|
||||
finish_node_seen = true;
|
||||
} else {
|
||||
|
@ -277,15 +264,15 @@ public class StanzaReader {
|
|||
}
|
||||
ns_state = ns_state.pop();
|
||||
return res;
|
||||
} catch (XmlError e) {
|
||||
} catch (IOError.INVALID_DATA e) {
|
||||
uint8[] buffer_cpy = new uint8[buffer.length + 1];
|
||||
Memory.copy(buffer_cpy, buffer, buffer.length);
|
||||
warning("XmlError at: %s".printf((string)buffer_cpy) + "\n");
|
||||
warning("invalid data at: %s".printf((string)buffer_cpy) + "\n");
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
public async StanzaNode read_node() throws XmlError {
|
||||
public async StanzaNode read_node() throws IOError {
|
||||
yield skip_until_non_ws();
|
||||
if ((yield peek_single()) == '<') {
|
||||
return yield read_stanza_node();
|
||||
|
|
|
@ -12,11 +12,11 @@ public class StanzaWriter {
|
|||
this.output = output;
|
||||
}
|
||||
|
||||
public async void write_node(StanzaNode node) throws XmlError {
|
||||
public async void write_node(StanzaNode node) throws IOError {
|
||||
yield write_data(node.to_xml().data);
|
||||
}
|
||||
|
||||
public async void write_nodes(StanzaNode node1, StanzaNode node2) throws XmlError {
|
||||
public async void write_nodes(StanzaNode node1, StanzaNode node2) throws IOError {
|
||||
var data1 = node1.to_xml().data;
|
||||
var data2 = node2.to_xml().data;
|
||||
|
||||
|
@ -32,11 +32,11 @@ public class StanzaWriter {
|
|||
yield write_data(concat);
|
||||
}
|
||||
|
||||
public async void write(string s) throws XmlError {
|
||||
public async void write(string s) throws IOError {
|
||||
yield write_data(s.data);
|
||||
}
|
||||
|
||||
private async void write_data(owned uint8[] data) throws XmlError {
|
||||
private async void write_data(owned uint8[] data) throws IOError {
|
||||
if (running) {
|
||||
queue.push_tail(new SourceFuncWrapper(write_data.callback));
|
||||
yield;
|
||||
|
@ -44,9 +44,12 @@ public class StanzaWriter {
|
|||
running = true;
|
||||
try {
|
||||
yield output.write_all_async(data, 0, null, null);
|
||||
} catch (IOError e) {
|
||||
cancel();
|
||||
throw e;
|
||||
} catch (GLib.Error e) {
|
||||
cancel();
|
||||
throw new XmlError.IO(@"IOError in GLib: $(e.message)");
|
||||
throw new IOError.FAILED("Error in GLib: %s".printf(e.message));
|
||||
} finally {
|
||||
SourceFuncWrapper? sfw = queue.pop_head();
|
||||
if (sfw != null) {
|
||||
|
|
|
@ -13,7 +13,7 @@ public class Xmpp.StartTlsXmppStream : TlsXmppStream {
|
|||
this.on_invalid_cert = on_invalid_cert;
|
||||
}
|
||||
|
||||
public override async void connect() throws IOStreamError {
|
||||
public override async void connect() throws IOError {
|
||||
try {
|
||||
SocketClient client = new SocketClient();
|
||||
debug("Connecting to %s:%i (starttls)", host, port);
|
||||
|
@ -50,8 +50,10 @@ public class Xmpp.StartTlsXmppStream : TlsXmppStream {
|
|||
yield setup();
|
||||
|
||||
attach_negotation_modules();
|
||||
} catch (IOError e) {
|
||||
throw e;
|
||||
} catch (Error e) {
|
||||
throw new IOStreamError.CONNECT("Failed connecting to %s:%i (starttls): %s", host, port, e.message);
|
||||
throw new IOError.CONNECTION_REFUSED("Failed connecting to %s:%i (starttls): %s", host, port, e.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@ namespace Xmpp {
|
|||
public class XmppStreamResult {
|
||||
public TlsXmppStream? stream { get; set; }
|
||||
public TlsCertificateFlags? tls_errors { get; set; }
|
||||
public IOStreamError? io_error { get; set; }
|
||||
public IOError? io_error { get; set; }
|
||||
}
|
||||
|
||||
public async XmppStreamResult establish_stream(Jid bare_jid, Gee.List<XmppStreamModule> modules, string? log_options, owned TlsXmppStream.OnInvalidCert on_invalid_cert) {
|
||||
|
@ -55,7 +55,7 @@ namespace Xmpp {
|
|||
// Try all connection options from lowest to highest priority
|
||||
TlsXmppStream? stream = null;
|
||||
TlsCertificateFlags? tls_errors = null;
|
||||
IOStreamError? io_error = null;
|
||||
IOError? io_error = null;
|
||||
foreach (SrvTargetInfo target in targets) {
|
||||
try {
|
||||
if (target.service == "xmpp-client") {
|
||||
|
@ -72,7 +72,7 @@ namespace Xmpp {
|
|||
yield stream.connect();
|
||||
|
||||
return new XmppStreamResult() { stream=stream };
|
||||
} catch (IOStreamError e) {
|
||||
} catch (IOError e) {
|
||||
warning("Could not establish XMPP session with %s:%i: %s", target.host, target.port, e.message);
|
||||
|
||||
if (stream != null) {
|
||||
|
|
|
@ -1,13 +1,5 @@
|
|||
using Gee;
|
||||
|
||||
public errordomain Xmpp.IOStreamError {
|
||||
READ,
|
||||
WRITE,
|
||||
CONNECT,
|
||||
DISCONNECT,
|
||||
TLS
|
||||
}
|
||||
|
||||
public abstract class Xmpp.XmppStream {
|
||||
|
||||
public signal void received_node(XmppStream stream, StanzaNode node);
|
||||
|
@ -38,18 +30,18 @@ public abstract class Xmpp.XmppStream {
|
|||
this.remote_name = remote_name;
|
||||
}
|
||||
|
||||
public abstract async void connect() throws IOStreamError;
|
||||
public abstract async void connect() throws IOError;
|
||||
|
||||
public abstract async void disconnect() throws IOStreamError, XmlError, IOError;
|
||||
public abstract async void disconnect() throws IOError;
|
||||
|
||||
public abstract async StanzaNode read() throws IOStreamError;
|
||||
public abstract async StanzaNode read() throws IOError;
|
||||
|
||||
[Version (deprecated = true, deprecated_since = "0.1", replacement = "write_async")]
|
||||
public abstract void write(StanzaNode node);
|
||||
|
||||
public abstract async void write_async(StanzaNode node) throws IOStreamError;
|
||||
public abstract async void write_async(StanzaNode node) throws IOError;
|
||||
|
||||
public abstract async void setup() throws IOStreamError;
|
||||
public abstract async void setup() throws IOError;
|
||||
|
||||
public void require_setup() {
|
||||
setup_needed = true;
|
||||
|
@ -105,7 +97,7 @@ public abstract class Xmpp.XmppStream {
|
|||
return null;
|
||||
}
|
||||
|
||||
public async void loop() throws IOStreamError {
|
||||
public async void loop() throws IOError {
|
||||
while (true) {
|
||||
if (setup_needed) {
|
||||
yield setup();
|
||||
|
@ -168,7 +160,7 @@ public abstract class Xmpp.XmppStream {
|
|||
return false;
|
||||
}
|
||||
|
||||
private bool negotiation_modules_done() throws IOStreamError {
|
||||
private bool negotiation_modules_done() throws IOError {
|
||||
if (setup_needed) return false;
|
||||
if (is_negotiation_active()) return false;
|
||||
|
||||
|
@ -176,7 +168,7 @@ public abstract class Xmpp.XmppStream {
|
|||
if (module is XmppStreamNegotiationModule) {
|
||||
XmppStreamNegotiationModule negotiation_module = (XmppStreamNegotiationModule) module;
|
||||
if (negotiation_module.mandatory_outstanding(this)) {
|
||||
throw new IOStreamError.CONNECT("mandatory-to-negotiate feature not negotiated: " + negotiation_module.get_id());
|
||||
throw new IOError.FAILED("mandatory-to-negotiate feature not negotiated: " + negotiation_module.get_id());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,13 +15,9 @@ namespace Xmpp {
|
|||
public signal void received_error(XmppStream stream, MessageStanza message, ErrorStanza error);
|
||||
public signal void received_message_unprocessed(XmppStream stream, MessageStanza message);
|
||||
|
||||
public async void send_message(XmppStream stream, MessageStanza message) throws IOStreamError {
|
||||
public async void send_message(XmppStream stream, MessageStanza message) throws IOError {
|
||||
yield send_pipeline.run(stream, message);
|
||||
try {
|
||||
yield stream.write_async(message.stanza);
|
||||
} catch (IOStreamError e) {
|
||||
throw new SendError.IO(e.message);
|
||||
}
|
||||
}
|
||||
|
||||
public async void received_message_stanza_async(XmppStream stream, StanzaNode node) {
|
||||
|
|
|
@ -25,7 +25,7 @@ public class Module : XmppStreamNegotiationModule, WriteNodeFunc {
|
|||
}
|
||||
}
|
||||
|
||||
public async void write_stanza(XmppStream stream, StanzaNode node) throws IOStreamError {
|
||||
public async void write_stanza(XmppStream stream, StanzaNode node) throws IOError {
|
||||
var promise = new Promise<IOError?>();
|
||||
|
||||
node_queue.add(new QueueItem(node, promise));
|
||||
|
@ -34,7 +34,7 @@ public class Module : XmppStreamNegotiationModule, WriteNodeFunc {
|
|||
try {
|
||||
yield promise.future.wait_async();
|
||||
} catch (FutureError e) {
|
||||
throw new IOStreamError.WRITE("Future returned error %i".printf(e.code));
|
||||
throw new IOError.FAILED("Future returned error %i".printf(e.code));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -50,7 +50,7 @@ public class Module : XmppStreamNegotiationModule, WriteNodeFunc {
|
|||
} else {
|
||||
yield ((!)writer).write_node(node);
|
||||
}
|
||||
} catch (XmlError e) { }
|
||||
} catch (IOError e) { }
|
||||
}
|
||||
|
||||
private void check_queue(XmppStream stream) {
|
||||
|
@ -158,7 +158,7 @@ public class Module : XmppStreamNegotiationModule, WriteNodeFunc {
|
|||
handle_incoming_h(stream, h_outbound);
|
||||
}
|
||||
foreach (var id in in_flight_stanzas.keys) {
|
||||
in_flight_stanzas[id].promise.set_exception(new IOStreamError.WRITE("Stanza not acked and session not resumed"));
|
||||
in_flight_stanzas[id].promise.set_exception(new IOError.FAILED("Stanza not acked and session not resumed"));
|
||||
}
|
||||
in_flight_stanzas.clear();
|
||||
check_queue(stream);
|
||||
|
|
|
@ -11,7 +11,7 @@ public class Module : XmppStreamModule {
|
|||
|
||||
private ReceivedPipelineListener received_pipeline_listener = new ReceivedPipelineListener();
|
||||
|
||||
public async void send_reaction(XmppStream stream, Jid jid, string stanza_type, string message_id, Gee.List<string> reactions) throws SendError {
|
||||
public async void send_reaction(XmppStream stream, Jid jid, string stanza_type, string message_id, Gee.List<string> reactions) throws IOError {
|
||||
StanzaNode reactions_node = new StanzaNode.build("reactions", NS_URI).add_self_xmlns();
|
||||
reactions_node.put_attribute("id", message_id);
|
||||
foreach (string reaction in reactions) {
|
||||
|
|
|
@ -38,11 +38,3 @@ public long from_hex(string numeral) {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
namespace Xmpp {
|
||||
public errordomain SendError {
|
||||
IO,
|
||||
NoStream,
|
||||
Misc
|
||||
}
|
||||
}
|
||||
|
|
|
@ -65,7 +65,7 @@ class StanzaTest : Gee.TestCase {
|
|||
try {
|
||||
yield reader.read_node();
|
||||
fail_if_reached("end of stream should be reached");
|
||||
} catch (XmlError.EOF e) {
|
||||
} catch (IOError.CLOSED e) {
|
||||
return;
|
||||
} catch (Error e) {
|
||||
fail_if_reached("Unexpected error");
|
||||
|
|
Loading…
Reference in a new issue