mirror of
https://github.com/vanitasvitae/Smack.git
synced 2024-06-27 22:04:50 +02:00
60b07b1d67
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.
88 lines
3.5 KiB
Java
88 lines
3.5 KiB
Java
/**
|
|
*
|
|
* Copyright 2003-2007 Jive Software.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package org.jivesoftware.smackx.disco.provider;
|
|
|
|
import org.jivesoftware.smack.provider.IQProvider;
|
|
import org.jivesoftware.smack.util.PacketParserUtils;
|
|
import org.jivesoftware.smackx.disco.packet.DiscoverInfo;
|
|
import org.xmlpull.v1.XmlPullParser;
|
|
|
|
/**
|
|
* The DiscoverInfoProvider parses Service Discovery information packets.
|
|
*
|
|
* @author Gaston Dombiak
|
|
*/
|
|
public class DiscoverInfoProvider extends IQProvider<DiscoverInfo> {
|
|
|
|
@Override
|
|
public DiscoverInfo parse(XmlPullParser parser, int initialDepth)
|
|
throws Exception {
|
|
DiscoverInfo discoverInfo = new DiscoverInfo();
|
|
boolean done = false;
|
|
DiscoverInfo.Identity identity = null;
|
|
String category = "";
|
|
String identityName = "";
|
|
String type = "";
|
|
String variable = "";
|
|
String lang = "";
|
|
discoverInfo.setNode(parser.getAttributeValue("", "node"));
|
|
while (!done) {
|
|
int eventType = parser.next();
|
|
if (eventType == XmlPullParser.START_TAG) {
|
|
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 {
|
|
PacketParserUtils.addExtensionElement(discoverInfo, parser);
|
|
}
|
|
} 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, identityName, lang);
|
|
discoverInfo.addIdentity(identity);
|
|
}
|
|
if (parser.getName().equals("feature")) {
|
|
// Create a new feature and add it to the discovered info.
|
|
boolean notADuplicateFeature = discoverInfo.addFeature(variable);
|
|
assert(notADuplicateFeature);
|
|
}
|
|
if (parser.getName().equals("query")) {
|
|
done = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return discoverInfo;
|
|
}
|
|
}
|