From 60b07b1d679b0313550eab32e7eb48cc079533f0 Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Fri, 3 Jun 2016 10:54:18 +0200 Subject: [PATCH] Make DiscoverInfoProvider namespace aware Some servers respond to disco#info requests with Note the which will cause the current parser implementation to parse it as DiscoInfo Feature resulting in an Exception because some attributes are missing. This commit prevents this. --- .../disco/provider/DiscoverInfoProvider.java | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/disco/provider/DiscoverInfoProvider.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/disco/provider/DiscoverInfoProvider.java index 577041633..9baaa3742 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/disco/provider/DiscoverInfoProvider.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/disco/provider/DiscoverInfoProvider.java @@ -36,7 +36,7 @@ public class DiscoverInfoProvider extends IQProvider { boolean done = false; DiscoverInfo.Identity identity = null; String category = ""; - String name = ""; + String identityName = ""; String type = ""; String variable = ""; String lang = ""; @@ -44,16 +44,22 @@ public class DiscoverInfoProvider extends IQProvider { while (!done) { int eventType = parser.next(); if (eventType == XmlPullParser.START_TAG) { - if (parser.getName().equals("identity")) { - // Initialize the variables from the parsed XML - category = parser.getAttributeValue("", "category"); - name = parser.getAttributeValue("", "name"); - type = parser.getAttributeValue("", "type"); - lang = parser.getAttributeValue(parser.getNamespace("xml"), "lang"); - } - else if (parser.getName().equals("feature")) { - // Initialize the variables from the parsed XML - variable = parser.getAttributeValue("", "var"); + final String name = parser.getName(); + final String namespace = parser.getNamespace(); + if (namespace.equals(DiscoverInfo.NAMESPACE)) { + switch (name) { + case "identity": + // Initialize the variables from the parsed XML + category = parser.getAttributeValue("", "category"); + identityName = parser.getAttributeValue("", "name"); + type = parser.getAttributeValue("", "type"); + lang = parser.getAttributeValue(parser.getNamespace("xml"), "lang"); + break; + case "feature": + // Initialize the variables from the parsed XML + variable = parser.getAttributeValue("", "var"); + break; + } } // Otherwise, it must be a packet extension. else { @@ -62,7 +68,7 @@ public class DiscoverInfoProvider extends IQProvider { } else if (eventType == XmlPullParser.END_TAG) { if (parser.getName().equals("identity")) { // Create a new identity and add it to the discovered info. - identity = new DiscoverInfo.Identity(category, type, name, lang); + identity = new DiscoverInfo.Identity(category, type, identityName, lang); discoverInfo.addIdentity(identity); } if (parser.getName().equals("feature")) {