mirror of
https://codeberg.org/Mercury-IM/Smack
synced 2024-11-22 22:32:06 +01:00
Make DiscoverInfoProvider namespace aware
Some servers respond to disco#info requests with <iq id='npGtO-21' type='result' to='phone@xxx/MAXS' from='xxx'> <query xmlns='http://jabber.org/protocol/disco#info'> <identity type='pep' name='Prosody' category='pubsub'/> <identity type='im' name='Prosody' category='server'/> <feature var='urn:xmpp:blocking'/> <feature var='urn:xmpp:carbons:2'/> <feature var='urn:xmpp:carbons:1'/> <feature var='vcard-temp'/> <feature var='http://jabber.org/protocol/commands'/> <feature var='urn:xmpp:mam:0'/> <feature var='jabber:iq:private'/> <feature var='http://jabber.org/protocol/pubsub#publish'/> <feature var='http://jabber.org/protocol/disco#info'/> <feature var='http://jabber.org/protocol/disco#items'/> <feature var='urn:xmpp:ping'/> <feature var='msgoffline'/> <feature var='jabber:iq:roster'/> <feature var='urn:xmpp:archive:auto'/> <feature var='urn:xmpp:archive:manage'/> <feature var='urn:xmpp:archive:pref'/> <feature var='http://jabber.org/protocol/rsm'/> <feature xmlns='urn:xmpp:archive'><optional><default/></optional></feature> </query></iq> Note the <feature xmlns='urn:xmpp:archive'><optional><default/></optional></feature> 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.
This commit is contained in:
parent
3bd35ecb1a
commit
60b07b1d67
1 changed files with 18 additions and 12 deletions
|
@ -36,7 +36,7 @@ public class DiscoverInfoProvider extends IQProvider<DiscoverInfo> {
|
||||||
boolean done = false;
|
boolean done = false;
|
||||||
DiscoverInfo.Identity identity = null;
|
DiscoverInfo.Identity identity = null;
|
||||||
String category = "";
|
String category = "";
|
||||||
String name = "";
|
String identityName = "";
|
||||||
String type = "";
|
String type = "";
|
||||||
String variable = "";
|
String variable = "";
|
||||||
String lang = "";
|
String lang = "";
|
||||||
|
@ -44,16 +44,22 @@ public class DiscoverInfoProvider extends IQProvider<DiscoverInfo> {
|
||||||
while (!done) {
|
while (!done) {
|
||||||
int eventType = parser.next();
|
int eventType = parser.next();
|
||||||
if (eventType == XmlPullParser.START_TAG) {
|
if (eventType == XmlPullParser.START_TAG) {
|
||||||
if (parser.getName().equals("identity")) {
|
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
|
// Initialize the variables from the parsed XML
|
||||||
category = parser.getAttributeValue("", "category");
|
category = parser.getAttributeValue("", "category");
|
||||||
name = parser.getAttributeValue("", "name");
|
identityName = parser.getAttributeValue("", "name");
|
||||||
type = parser.getAttributeValue("", "type");
|
type = parser.getAttributeValue("", "type");
|
||||||
lang = parser.getAttributeValue(parser.getNamespace("xml"), "lang");
|
lang = parser.getAttributeValue(parser.getNamespace("xml"), "lang");
|
||||||
}
|
break;
|
||||||
else if (parser.getName().equals("feature")) {
|
case "feature":
|
||||||
// Initialize the variables from the parsed XML
|
// Initialize the variables from the parsed XML
|
||||||
variable = parser.getAttributeValue("", "var");
|
variable = parser.getAttributeValue("", "var");
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Otherwise, it must be a packet extension.
|
// Otherwise, it must be a packet extension.
|
||||||
else {
|
else {
|
||||||
|
@ -62,7 +68,7 @@ public class DiscoverInfoProvider extends IQProvider<DiscoverInfo> {
|
||||||
} else if (eventType == XmlPullParser.END_TAG) {
|
} else if (eventType == XmlPullParser.END_TAG) {
|
||||||
if (parser.getName().equals("identity")) {
|
if (parser.getName().equals("identity")) {
|
||||||
// Create a new identity and add it to the discovered info.
|
// 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);
|
discoverInfo.addIdentity(identity);
|
||||||
}
|
}
|
||||||
if (parser.getName().equals("feature")) {
|
if (parser.getName().equals("feature")) {
|
||||||
|
|
Loading…
Reference in a new issue