001/** 002 * 003 * Copyright 2003-2007 Jive Software. 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018package org.jivesoftware.smackx.disco.provider; 019 020import java.io.IOException; 021 022import org.jivesoftware.smack.SmackException; 023import org.jivesoftware.smack.provider.IQProvider; 024import org.jivesoftware.smack.util.PacketParserUtils; 025import org.jivesoftware.smackx.disco.packet.DiscoverInfo; 026import org.xmlpull.v1.XmlPullParser; 027import org.xmlpull.v1.XmlPullParserException; 028 029/** 030* The DiscoverInfoProvider parses Service Discovery information packets. 031* 032* @author Gaston Dombiak 033*/ 034public class DiscoverInfoProvider extends IQProvider<DiscoverInfo> { 035 036 @Override 037 public DiscoverInfo parse(XmlPullParser parser, int initialDepth) 038 throws XmlPullParserException, IOException, SmackException { 039 DiscoverInfo discoverInfo = new DiscoverInfo(); 040 boolean done = false; 041 DiscoverInfo.Identity identity = null; 042 String category = ""; 043 String name = ""; 044 String type = ""; 045 String variable = ""; 046 String lang = ""; 047 discoverInfo.setNode(parser.getAttributeValue("", "node")); 048 while (!done) { 049 int eventType = parser.next(); 050 if (eventType == XmlPullParser.START_TAG) { 051 if (parser.getName().equals("identity")) { 052 // Initialize the variables from the parsed XML 053 category = parser.getAttributeValue("", "category"); 054 name = parser.getAttributeValue("", "name"); 055 type = parser.getAttributeValue("", "type"); 056 lang = parser.getAttributeValue(parser.getNamespace("xml"), "lang"); 057 } 058 else if (parser.getName().equals("feature")) { 059 // Initialize the variables from the parsed XML 060 variable = parser.getAttributeValue("", "var"); 061 } 062 // Otherwise, it must be a packet extension. 063 else { 064 PacketParserUtils.addExtensionElement(discoverInfo, parser); 065 } 066 } else if (eventType == XmlPullParser.END_TAG) { 067 if (parser.getName().equals("identity")) { 068 // Create a new identity and add it to the discovered info. 069 identity = new DiscoverInfo.Identity(category, type, name, lang); 070 discoverInfo.addIdentity(identity); 071 } 072 if (parser.getName().equals("feature")) { 073 // Create a new feature and add it to the discovered info. 074 boolean notADuplicateFeature = discoverInfo.addFeature(variable); 075 assert(notADuplicateFeature); 076 } 077 if (parser.getName().equals("query")) { 078 done = true; 079 } 080 } 081 } 082 083 return discoverInfo; 084 } 085}