1using Gee; 2 3namespace Xmpp.Xep.ServiceDiscovery { 4 5public class InfoResult { 6 public Iq.Stanza iq { get; private set; } 7 8 public Gee.List<string> features { 9 owned get { 10 ArrayList<string> ret = new ArrayList<string>(); 11 foreach (StanzaNode feature_node in iq.stanza.get_subnode("query", NS_URI_INFO).get_subnodes("feature", NS_URI_INFO)) { 12 ret.add(feature_node.get_attribute("var", NS_URI_INFO)); 13 } 14 return ret; 15 } 16 set { 17 foreach (string feature in value) { 18 add_feature(feature); 19 } 20 } 21 } 22 23 public Gee.Set<Identity> identities { 24 owned get { 25 HashSet<Identity> ret = new HashSet<Identity>(); 26 foreach (StanzaNode feature_node in iq.stanza.get_subnode("query", NS_URI_INFO).get_subnodes("identity", NS_URI_INFO)) { 27 ret.add(new Identity(feature_node.get_attribute("category", NS_URI_INFO), 28 feature_node.get_attribute("type", NS_URI_INFO), 29 feature_node.get_attribute("name", NS_URI_INFO))); 30 } 31 return ret; 32 } 33 set { 34 foreach (Identity identity in value) { 35 add_identity(identity); 36 } 37 } 38 } 39 40 public InfoResult(Iq.Stanza iq_request) { 41 iq = new Iq.Stanza.result(iq_request); 42 string? node = iq_request.stanza.get_subnode("query", NS_URI_INFO).get_attribute("node"); 43 StanzaNode query = new StanzaNode.build("query", NS_URI_INFO).add_self_xmlns(); 44 if (node != null) { 45 query.set_attribute("node", node); 46 } 47 iq.stanza.put_node(query); 48 } 49 50 private InfoResult.from_iq(Iq.Stanza iq) { 51 this.iq = iq; 52 } 53 54 public static InfoResult? create_from_iq(Iq.Stanza iq) { 55 if (iq.is_error()) return null; 56 StanzaNode query_node = iq.stanza.get_subnode("query", NS_URI_INFO); 57 if (query_node == null) return null; 58 StanzaNode feature_node = query_node.get_subnode("feature", NS_URI_INFO); 59 if (feature_node == null) return null; 60 StanzaNode identity_node = query_node.get_subnode("identity", NS_URI_INFO); 61 if (identity_node == null) return null; 62 return new ServiceDiscovery.InfoResult.from_iq(iq); 63 } 64 65 public void add_feature(string feature) { 66 iq.stanza.get_subnode("query", NS_URI_INFO).put_node(new StanzaNode.build("feature", NS_URI_INFO).put_attribute("var", feature)); 67 } 68 69 public void add_identity(Identity identity) { 70 StanzaNode identity_node = new StanzaNode.build("identity", NS_URI_INFO) 71 .put_attribute("category", identity.category) 72 .put_attribute("type", identity.type_); 73 if (identity.name != null) { 74 identity_node.put_attribute("name", identity.name); 75 } 76 iq.stanza.get_subnode("query", NS_URI_INFO).put_node(identity_node); 77 } 78} 79 80} 81