From 7c4260eed718961874fc0ea665263ea2ce59338b Mon Sep 17 00:00:00 2001 From: fiaxh Date: Tue, 21 Apr 2020 16:25:21 +0200 Subject: Remove features from service discovery module when detaching module from stream fixes #179 fixes #812 --- .../module/xep/0030_service_discovery/module.vala | 33 ++++++++++++++++------ 1 file changed, 25 insertions(+), 8 deletions(-) (limited to 'xmpp-vala/src/module/xep/0030_service_discovery/module.vala') diff --git a/xmpp-vala/src/module/xep/0030_service_discovery/module.vala b/xmpp-vala/src/module/xep/0030_service_discovery/module.vala index e2bb46f8..332e8fc3 100644 --- a/xmpp-vala/src/module/xep/0030_service_discovery/module.vala +++ b/xmpp-vala/src/module/xep/0030_service_discovery/module.vala @@ -9,27 +9,39 @@ public const string NS_URI_ITEMS = NS_URI + "#items"; public class Module : XmppStreamModule, Iq.Handler { public static ModuleIdentity IDENTITY = new ModuleIdentity(NS_URI, "0030_service_discovery_module"); - public ArrayList identities = new ArrayList(); + public Identity own_identity; public Module.with_identity(string category, string type, string? name = null) { - add_identity(category, type, name); + own_identity = new Identity(category, type, name); } public void add_feature(XmppStream stream, string feature) { stream.get_flag(Flag.IDENTITY).add_own_feature(feature); } + public void remove_feature(XmppStream stream, string feature) { + stream.get_flag(Flag.IDENTITY).remove_own_feature(feature); + } + public void add_feature_notify(XmppStream stream, string feature) { add_feature(stream, feature + "+notify"); } - public void add_identity(string category, string type, string? name = null) { - identities.add(new Identity(category, type, name)); + public void remove_feature_notify(XmppStream stream, string feature) { + remove_feature(stream, feature + "+notify"); + } + + public void add_identity(XmppStream stream, Identity identity) { + stream.get_flag(Flag.IDENTITY).add_own_identity(identity); } - public delegate void HasEntryCategoryRes(XmppStream stream, Gee.List? identities); + public void remove_identity(XmppStream stream, Identity identity) { + stream.get_flag(Flag.IDENTITY).remove_own_identity(identity); + } + + public delegate void HasEntryCategoryRes(XmppStream stream, Gee.Set? identities); public void get_entity_categories(XmppStream stream, Jid jid, owned HasEntryCategoryRes listener) { - Gee.List? res = stream.get_flag(Flag.IDENTITY).get_entity_categories(jid); + Gee.Set? res = stream.get_flag(Flag.IDENTITY).get_entity_categories(jid); if (res != null) listener(stream, res); request_info(stream, jid, (stream, query_result) => { listener(stream, query_result != null ? query_result.identities : null); @@ -68,12 +80,17 @@ public class Module : XmppStreamModule, Iq.Handler { public override void attach(XmppStream stream) { stream.add_flag(new Flag()); + add_identity(stream, own_identity); + stream.get_module(Iq.Module.IDENTITY).register_for_namespace(NS_URI_INFO, this); add_feature(stream, NS_URI_INFO); } public override void detach(XmppStream stream) { + remove_identity(stream, own_identity); + stream.get_module(Iq.Module.IDENTITY).unregister_from_namespace(NS_URI_INFO, this); + remove_feature(stream, NS_URI_INFO); } public static void require(XmppStream stream) { @@ -85,8 +102,8 @@ public class Module : XmppStreamModule, Iq.Handler { private void send_query_result(XmppStream stream, Iq.Stanza iq_request) { InfoResult query_result = new ServiceDiscovery.InfoResult(iq_request); - query_result.features = stream.get_flag(Flag.IDENTITY).features; - query_result.identities = identities; + query_result.features = stream.get_flag(Flag.IDENTITY).own_features; + query_result.identities = stream.get_flag(Flag.IDENTITY).own_identities; stream.get_module(Iq.Module.IDENTITY).send_iq(stream, query_result.iq); } } -- cgit v1.3